哪个在MySQL where子句中表现更好:YEAR()vs BETWEEN?

abe*_*ger 5 mysql performance

我需要从MySQL数据库中查找给定年份中创建的所有记录.以下任何一种方法是否会比另一方慢?

WHERE create_date BETWEEN '2009-01-01 00:00:00' AND '2009-12-31 23:59:59'
Run Code Online (Sandbox Code Playgroud)

要么

WHERE YEAR(create_date) = '2009'
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 5

这个:

WHERE create_date BETWEEN '2009-01-01 00:00:00' AND '2009-12-31 23:59:59'
Run Code Online (Sandbox Code Playgroud)

...效果更好,因为它不会更改create_date列中的数据。这意味着,如果上有一个索引create_date,则可以使用该索引-因为该索引位于列中存在的实际值上。

不能在上使用索引YEAR(create_date),因为它仅使用值的一部分(需要提取)。


Mar*_*ams 5

每当您对列使用函数时,它必须在每一行上执行该函数,以查看它是否与常量匹配。这可以防止使用索引。

因此,基本的经验法则是避免在比较的左侧使用函数。

Sargable 意味着 DBMS 可以使用索引。使用左侧的列和右侧的常量以允许 DBMS 使用索引。

即使您在 create_date 列上没有索引,DBMS 仍然存在为每一行运行 YEAR() 函数的开销。因此,无论如何,第一种方法很可能更快。