MySQL не использует индекс, созданный даже после использования индекса и индекса силы - PullRequest
2 голосов
/ 21 марта 2012

Итак, у меня следующий запрос:

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) для обработки этого запроса.

Когда яdo:

EXPLAIN SELECT id, name, title, description, time FROM entity WHERE (date_end = CURRENT_DATE  AND time_end >= CURRENT_TIME)

Используется индекс, который я создал (date_end)

Кажется, проблема в запросе - это часть date_end> CURRENT_DATE и next_call

Я пытался использовать USE INDEX и FORCE INDEX, но результат тот же - индексы не используются.я также попробовал ANALYZE TABLE.

Моя табличная сущность представляет собой таблицу INNODB с первичным ключом для идентификатора и индексами для date_end, next_date и (next_date, date_end).

1 Ответ

0 голосов
/ 21 марта 2012

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))

нет «части», в которой «составлены» next_date и date_end.Когда вы посмотрите на эту часть WHERE, MySql попытается «разрешить» первую строку, а затем вторую строку.Если вы посмотрите на первую строку, то нет next_date и date_end ... поэтому ваш составной индекс бесполезен, и вы не можете заставить его использовать mysql.Создание индексов (date_end, time_end) и (next_date, next_time), вероятно, имеет смысл (но не уверен, насколько это повысит вашу производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...