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

Jak*_*pes 2 mysql partitioning

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

分区是每月的(p1 - p50),最后有一个 pmax 包罗万象的内容。在下面的示例中,我预计只有分区 p45 会被命中。

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

我在分区列下列出了 p1,p45

5.1 和 5.5 中都会发生这种情况

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

Ant*_*yen 5

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

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)”),这也会捕获所有错误日期。