我们有清单表,保留所有产品。产品的有效期限由列表表中的“ 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可能足够大。分析很少说出任何可行的方法。