我有一个带有索引日期时间值的表。比方说它叫做event_datetime。
如果我使用表中已知的现有值进行查询,则查询速度比使用任意绑定更快。例如:
SELECT SUM(event_datetime) FROM table WHERE DATE(event_datetime) >= '2020-03-01' AND DATE(event_datetime) <= '2020-03-21';
对比:
SELECT SUM(event_datetime) FROM table WHERE DATE(event_datetime) >= '2020-03-01' AND DATE(event_datetime) <= '2020-03-31';
假设表中存在event_datetime为"2020-03-21"(包括"2020-03-201"(的仅限数据的行,则由于在idnex中找不到大于"2020-05-21"的值,查询到第31条的后一条语句是否会导致完整的表扫描?
性能方面,查询的问题是在谓词上使用日期函数:
DATE(event_datetime) >= '2020-03-01' AND DATE(event_datetime) <= '2020-03-21'
对要筛选的列使用DATE()
实际上可以防止数据库利用event_datetime
上的索引,因为在进行筛选之前,必须将该函数应用于列中的所有值。我们说它使查询不可SARGeable。
一个更好的选择是:
event_datetime >= '2020-03-01' AND event_datetime < '2020-03-21'