Mysql:如何在mysql where子句中正确使用和索引日期时间字段?

时间:2017-08-01 10:59:46

标签: mysql performance indexing

我们有列表,我们保留所有产品。产品的到期时间由列表表中的“ExpiryDate”列确定。我们希望获得前一天过期的所有商家信息:

上一个查询:

SELECT * from listings
WHERE DATE(ExpiryDate + interval 1 day) = DATE(now());

修改后的查询:

SELECT * from listings
WHERE ExpiryDate between DATE_FORMAT(now()- interval 1 day, '%Y-%m-%d 00:00:00') and DATE_FORMAT(now() -interval 1 day, '%Y-%m-%d 23:59:59');

我在某处读到过,在“之前的查询”中,我们无法在日期时使用索引,而我们可以在“修改后的查询”中利用索引优化。那是对的吗?如果我们将索引放在“ExpiryDate”列上,那么“修改后的查询”是否会针对性能进行最佳调整?

1 个答案:

答案 0 :(得分:2)

基本规则是避免在函数调用中隐藏索引列。在你的"之前"查询它同时是DATE()+ INTERVAL,这实际上是一个函数调用。

此外,可以进行一些简化说明"它是否已经过期昨天":

WHERE ExpiryDate >= CURDATE() - INTERVAL 1 DAY
  AND ExpiryDate  < CURDATE()

您需要INDEX(ExpiryDate)

innodb_buffer_pool_size通常很重要,应该是可用 RAM的70%左右。但是,buffer_pool可能足够大。分析很少说任何可行的事情。