我们有列表,我们保留所有产品。产品的到期时间由列表表中的“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”列上,那么“修改后的查询”是否会针对性能进行最佳调整?
答案 0 :(得分:2)
基本规则是避免在函数调用中隐藏索引列。在你的"之前"查询它同时是DATE()
和+ INTERVAL
,这实际上是一个函数调用。
此外,可以进行一些简化说明"它是否已经过期昨天":
WHERE ExpiryDate >= CURDATE() - INTERVAL 1 DAY
AND ExpiryDate < CURDATE()
您需要INDEX(ExpiryDate)
。
innodb_buffer_pool_size
通常很重要,应该是可用 RAM的70%左右。但是,buffer_pool可能足够大。分析很少说任何可行的事情。