2011-05-05 69 views
2

我有一个表按id进行分区,并通过对代码进行散列(都是整数)。 30个分区,每个分区散列4个,共120个子分区。MySQL忽略查询中的子分区

如果我做了选择上的ID独自一人,解释计划表明,它的正确修剪下来只有分区&与之相关的子分区(4)

如果我做了选择上的ID +代码,解释计划显示,它的正确修剪下来到与之相关的一个特定子分区(1)

无论其...

如果我做了选择上的代码独自一人,解释计划似乎表明MySQL是做了充分的表扫描(120个分区),而不是像甲骨文一样行动,只扫描每个分区的一个子分区相关的分区(总共30个)。

当我不能删除整个分区时,我是否必须做一些特殊的事情才能让MySQL利用子分区修剪?还是MySQL(至少5.1)只是不支持自己利用子分区?

+0

您使用的是什么引擎类型? – Johan 2011-05-05 18:48:41

+0

我使用InnoDB – Bitbang3r 2011-05-06 00:13:38

+0

非常有趣。我很困惑,因为innoDB不会做散列键,但我想你的意思是存储在B +树中的计算散列。 – Johan 2011-05-06 04:27:41

回答

0

我找到了答案。似乎只有MySQL 5.5和更新版本才能够独立于主分区值而利用子分区。其中一天,我会记得开始关注我正在阅读的哪个版本的MySQL文档。

最终例如:

假设 '表' 由范围上的一个分区和由散列上B.

查询1 subpartitioned:“SELECT * from表,其中A =和B =和C? =?“:

  • 将按照预期在MySQL 5.1及更新版本下工作。 MySQL将忽略与不包含A值的范围相关联的任何分区,并且将忽略与B的值不相关的任何子分区。最坏的情况是,它只对单个分区的单个子分区中的行进行蛮力搜索。

查询2: “从表中选择其中B =和C =?”:

  • 可能工作例如MySQL 5.5和更新的下预期。如果Oracle能够正常工作,在最坏的情况下,它会从每个分区范围中搜索一个子分区。如果你有20个分区范围和4个子分区,最糟糕的情况是它会通过20个子分区进行强力搜索。

  • 在MySQL 5.1下无法按预期工作。它将逐个遍历所有80个子分区,并基本上执行全表扫描。