我有一个在to_days(created_at)上按范围分区的数据库。
分区是按月分区的(p1 - p50),最后是一个pmax catchall。在下面的示例中,我预计只会命中分区p45。
当我解释分区时,select * from units where created_at > "2013-01-01 00:00:00“和NOW()
我在partitions列下列出了p1、p45
在5.1和5.5中都会发生这种情况
为什么优化器要包含第一个分区来进行不等式检查?
发布于 2014-09-18 06:42:05
您很久以前就问过这个问题,但我也遇到了这个问题,并在这里找到了一个解决方法:
http://datacharmer.blogspot.com/2010/05/two-quick-performance-tips-with-mysql.html
..。基本上,您应该创建一个包含小于(0)的值的第一个分区,该值将始终为空。MySQL查询优化器仍将包括第一个分区,但至少它不应该执行任何资源密集型扫描。
更新:以下是我原始答案中链接的URL的简短摘要:
官方的MySQL错误跟踪器承认这种行为是一种特性:
错误描述:
无论BETWEEN子句中的范围是什么,使用TO_DAYS函数按范围分区的表在修剪时总是包含表中的第一个分区。
响应:
这不是一个错误,因为对于无效日期,TO_DAYS()返回NULL,它还需要扫描第一个分区(因为第一个分区保存所有NULL值)。
..。
一种性能解决方法是创建一个特定的分区来保存所有空值(如'...小于(0)'),这也会捕获所有不好的日期。
https://stackoverflow.com/questions/14629924
复制相似问题