MySQL:查询索引中不存在的值(即使 colunn 已编制索引)是否会导致全表扫描?



我有一个带有索引日期时间值的表。比方说它叫做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'

最新更新