MySQL忽略查询中的子分区

时间:2011-05-05 18:34:05

标签: mysql partitioning

我有一个表由id上的范围和代码上的哈希(都是整数)分区。 30个分区,每个4个散列子分区,共120个。

如果我单独选择id,解释计划显示它正确地仅修剪到分区&与之相关的子分区(4)

如果我对id +代码进行选择,解释计划显示它正确地修剪到与其相关的一个特定子分区(1)

...无论其

如果我单独选择代码,解释计划似乎表明MySQL正在进行全表扫描(120个分区),而不是像Oracle一样,只扫描每个分区中相关的一个子分区(共30个)。

当无法删除整个分区时,我是否必须做一些特别的事情来让MySQL利用子分区修剪?或者MySQL(至少5.1)不支持自己利用子分区?

1 个答案:

答案 0 :(得分:0)

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

最后的例子:

假设'table'按A上的范围分区,并且按B上的哈希分区。

查询1:“SELECT * from table,其中A =?且B =?且C =?”:

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

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

  • 可能在MySQL 5.5及更高版本下按预期工作。如果Oracle正常工作,在最坏的情况下,它将从每个分区范围中搜索单个子分区。如果你有20个分区范围和4个子分区,最坏的情况是它会通过20个子分区进行暴力搜索。

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