所以我有以下问题:
EXPLAIN
SELECT
id,
name,
title,
description,
time
FROM entity
WHERE
(date_end > CURRENT_DATE
OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME)
)
AND (next_date < CURRENT_DATE
OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME)
)
由于某种原因,mysql没有使用我在(next_date,date_end)上创建的索引来处理该查询。
当我这样做时:
EXPLAIN SELECT id, name, title, description, time FROM entity WHERE (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME)
它确实使用我在(date_end)上创建的索引
查询中的问题似乎是部分date_end&gt; CURRENT_DATE和next_call&lt; CURRENT_DATE - 添加这两部分时,不使用任何索引。
我尝试使用USE INDEX
和FORCE INDEX
,但结果相同 - 没有使用索引。我也试过ANALYZE TABLE
。
我的表实体是一个INNODB表,其中包含id上的主键,以及date_end,next_date和(next_date,date_end)上的索引。
答案 0 :(得分:0)
MySQL无法使用您创建的复合索引(next_date,date_end)。看看你的WHERE子句:
(date_end > CURRENT_DATE OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME))
AND
(next_date < CURRENT_DATE OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME))
没有“part”,其中next_date和date_end是“组合”的。当您查看此WHERE部分时,MySql将尝试“解析”第一行,然后是第二行。如果你看第一行,就没有next_date和date_end ...所以你的复合索引是没用的,你不能强迫mysql使用它。创建索引(date_end,time_end)和(next_date,next_time)可能是有意义的(但不确定能提高你的性能的程度。