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

时间:2013-01-31 16:01:20

标签: mysql partitioning

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

分区是每月(p1 - p50),最后有一个pmax catchall。在下面的例子中,我期待只有命中分区p45。

当我做一个解释分区时,从created_at>的单位中选择* “2013-01-01 00:00:00”和NOW()

我在分区列

下列出了p1,p45

在5.1和5.5

中都会发生这种情况

为什么优化器包括不等式检查的第一个分区?

1 个答案:

答案 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)'),这也会记录所有错误的日期。