MySQL 分区修剪始终包括不等式查询中的第一个分区

Posted

技术标签:

【中文标题】MySQL 分区修剪始终包括不等式查询中的第一个分区【英文标题】:MySQL partition pruning always includes first partition in inequality query 【发布时间】:2013-01-31 16:01:20 【问题描述】:

我在 to_days(created_at) 上有一个按范围分区的数据库。

分区是每月一次 (p1 - p50),最后是 pmax 总称。在下面的示例中,我希望只命中分区 p45。

当我做一个解释分区时选择 * from units where created_at > "2013-01-01 00:00:00" and NOW()

我得到 p1,p45 列在分区列下

这发生在 5.1 和 5.5 中

为什么优化器要包含第一个分区以进行不等式检查?

【问题讨论】:

【参考方案1】:

您很久以前就问过这个问题,但我也遇到了这个问题并在这里找到了解决方法:

http://datacharmer.blogspot.com/2010/05/two-quick-performance-tips-with-mysql.html

... 基本上您应该创建一个包含小于 (0) 的值的第一个分区,该分区将始终为空。 MySQL 查询优化器仍将包含第一个分区,但至少它不应该进行任何资源密集型扫描。

更新:这是我原始答案中链接的 URL 的简短摘要:

官方 MySQL bugtracker 承认此行为是一项功能:

错误描述:

无论 BETWEEN 子句中的范围如何,使用 TO_DAYS 函数按 RANGE 分区的表在修剪时始终包括表中的第一个分区。

回复:

这不是错误,因为 TO_DAYS() 对于无效日期返回 NULL,它还需要扫描第一个分区(因为它保存所有 NULL 值)以查找范围。

...

一种性能变通方法是创建一个特定的分区来保存所有 NULL 值(如'... LESS THAN (0)'),这也将捕获所有错误日期。

【讨论】:

您能否添加更多关于链接内容的摘要,以防万一它出现故障?

以上是关于MySQL 分区修剪始终包括不等式查询中的第一个分区的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的 BigQuery 用户定义函数不会修剪分区

使用左外连接时 Oracle 分区修剪不起作用

带有分页的MySql查询中的随机值

17.Mysql分区

mysql分区表

MySQL分区