即使在使用索引和强制索引之后,mysql也没有使用索引创建

时间:2012-03-21 00:53:01

标签: mysql sql

所以我有以下问题:

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 INDEXFORCE INDEX,但结果相同 - 没有使用索引。我也试过ANALYZE TABLE

我的表实体是一个INNODB表,其中包含id上的主键,以及date_end,next_date和(next_date,date_end)上的索引。

1 个答案:

答案 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)可能是有意义的(但不确定能提高你的性能的程度。