【问题标题】:MySQL ignoring subpartition in queryMySQL忽略查询中的子分区
【发布时间】:2011-05-05 18:34:05
【问题描述】:

我有一个表,它按 id 上的范围和代码上的哈希(两者都是整数)进行分区。 30 个分区,每个分区 4 个哈希子分区,总共 120 个。

如果我只对 id 进行选择,解释计划显示它正确地修剪到与其相关的分区和子分区 (4)

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

但是...

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

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

【问题讨论】:

  • 您使用的是什么引擎类型?
  • 非常有趣。我很困惑,因为 innoDB 不做散列键,但我猜你的意思是存储在 B+树中的计算散列。

标签: mysql partitioning


【解决方案1】:

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

最后一个例子:

假设“表”在 A 上按范围分区,并在 B 上按哈希进行子分区。

查询 1:“SELECT * from table where A=? and B=? and C=?”:

  • 在 MySQL 5.1 和更高版本下可以正常工作。 MySQL 将忽略与不包括 A 的值的范围关联的任何分区,并将忽略与 B 的值不相关的任何子分区。最坏的情况是,它只对单个分区的单个子分区中的行进行暴力搜索。

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

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

  • 在 MySQL 5.1 下无法正常工作。它会一一遍历所有80个子分区,基本上是做全表扫描。

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2016-11-27
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多