我需要从MySQL数据库中查找所有在特定年份创建的记录。以下两种方法,是否有一种比另一种慢?
WHERE create_date BETWEEN '2009-01-01 00:00:00' AND '2009-12-31 23:59:59'
或者
WHERE YEAR(create_date) = '2009'
我需要从MySQL数据库中查找所有在特定年份创建的记录。以下两种方法,是否有一种比另一种慢?
WHERE create_date BETWEEN '2009-01-01 00:00:00' AND '2009-12-31 23:59:59'
或者
WHERE YEAR(create_date) = '2009'
This:
WHERE create_date BETWEEN '2009-01-01 00:00:00' AND '2009-12-31 23:59:59'
...由于它不会更改create_date
列中的数据,因此DATE(create_date)
更好。这意味着如果create_date
上有索引,则可以使用该索引--因为索引是基于列中实际存在的值。
不能在YEAR(create_date)
上使用索引,因为它仅使用值的一部分(需要提取)。
思路:
但我预计BETWEEN会获胜。除非优化器足够聪明地为YEAR()进行优化,否则结果将是相同的。
另一个想法:
我认为你并不关心。
如果每年仅有少量记录,则即使进行全表扫描,查询也会很快,因为即使有(假设)100年的数据,记录数量也很少。
如果每年有非常多的记录(比如10^8),那么无论如何查询都会非常慢,因为返回那么多记录需要很长时间。
您没有说要保留多少年的数据。我猜如果这是一款考古数据库,您可能只有几千年的数据,如果是这样,您可能会关心是否存在大量数据负载。
我认为在这种情况下,你的应用程序极不可能注意到使用“好”的解释计划(使用索引范围扫描)和“坏”的解释计划(全表扫描)之间的差异。