2

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

分区是每月一次(p1 - p50),最后是 pmax 总括。在下面的示例中,我希望只命中分区 p45。

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

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

这发生在 5.1 和 5.5 中

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

4

1 回答 1

4

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

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

于 2014-09-17T22:42:05.350 回答