我有一个按to_days(created_at)范围分区的数据库。
分区是每月(p1 - p50),最后有一个pmax catchall。在下面的例子中,我期待只有命中分区p45。
当我做一个解释分区时,从created_at>的单位中选择* “2013-01-01 00:00:00”和NOW()
我在分区列
下列出了p1,p45在5.1和5.5
中都会发生这种情况为什么优化器包括不等式检查的第一个分区?
答案 0 :(得分:3)
很久以前你问过这个问题,但我也遇到了这个问题,并在此找到了解决方法:
http://datacharmer.blogspot.com/2010/05/two-quick-performance-tips-with-mysql.html
...基本上你应该创建一个包含小于(0)的值的第一个分区,它始终为空。 MySQL查询优化器仍将包含第一个分区,但至少它不应该进行任何资源密集型扫描。
更新:以下是我原始答案中链接的网址的简短摘要:
官方MySQL bugtracker将此行为确认为一项功能:
错误说明:
无论BETWEEN子句中的范围如何,由RANGE使用TO_DAYS函数分区的表在修剪时始终包括表中的第一个分区。
响应:
这不是错误,因为TO_DAYS()为无效日期返回NULL,它也需要扫描第一个分区(因为它包含所有NULL值)。
...
性能解决方法是创建一个特定的分区来保存所有NULL值(比如'...... LESS THAN(0)'),这也会记录所有错误的日期。