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 分区修剪始终包括不等式查询中的第一个分区的主要内容,如果未能解决你的问题,请参考以下文章