我们有清单表,保留所有产品。产品的有效期限由列表表中的“ 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”列上建立索引,“修改后的查询”是否最适合性能?

最佳答案

基本规则是避免在函数调用中隐藏索引列。在“上一个”查询中,它既是DATE()也是+ INTERVAL,实际上是一个函数调用。

另外,可以简化一些方式来表示“它昨天过期了”:

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


并且您需要INDEX(ExpiryDate)

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

07-26 08:55