我需要从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)
这个:
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),因为它仅使用值的一部分(需要提取)。
每当您对列使用函数时,它必须在每一行上执行该函数,以查看它是否与常量匹配。这可以防止使用索引。
因此,基本的经验法则是避免在比较的左侧使用函数。
Sargable 意味着 DBMS 可以使用索引。使用左侧的列和右侧的常量以允许 DBMS 使用索引。
即使您在 create_date 列上没有索引,DBMS 仍然存在为每一行运行 YEAR() 函数的开销。因此,无论如何,第一种方法很可能更快。
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |