ОБЪЯСНЕНИЕ следующего запроса приводит к «использованию где» (что, как я понимаю, нормально):

EXPLAIN SELECT niid
FROM news 
FORCE INDEX (ticker_market_date)
WHERE (ticker = "abcd" AND market = "") 
ORDER BY date DESC

Однако, если я добавлю предложение «ИЛИ» к моему «ГДЕ», я получаю «используя сортировку файлов»:

EXPLAIN SELECT niid
FROM news 
FORCE INDEX (ticker_market_date)
WHERE (ticker = "abcd" AND market = "") 
OR (ticker = "abcd" AND market = "ef")
ORDER BY date DESC

Как я могу создать индекс, который позволит использовать несколько условий ИЛИ (часто их будет больше, чем два, которые я показал выше), или как я могу реструктурировать свой запрос, чтобы использовать мой индекс? Или есть другой способ оптимизировать это?

Спасибо.

0
Shiro 27 Янв 2015 в 08:49
 – 
Barmar
27 Янв 2015 в 08:57

2 ответа

Если предположить, что ваш индекс ticker_market_date находится на (ticker, market, date), и предположить, что ticker = "abcd" AND market in ("", "ef") по-прежнему очень избирательный, кажется, что MySql может получить план запроса неправильный — ORDER BY – распространенная ошибка здесь . Что вы можете попробовать, так это вложить запрос так, чтобы ORDER BY применялся последним - это должно позволить вам удалить FORCE INDEX. Если все ваши предикаты фильтра имеют одинаковую форму, вы также можете очистить их до операторов IN, хотя это делается для удобства чтения и не должно влиять на производительность:

SELECT niid FROM
(
  SELECT niid, date
  FROM news 
  WHERE ticker = "abcd" AND market IN ("", "ef") 
) X
ORDER BY date DESC;
1
StuartLC 27 Янв 2015 в 09:02
Извините за мою очень медленную задержку с ответом, но это выглядит очень многообещающе. В ближайшие месяцы я займусь оптимизацией запросов, посмотрю, поможет ли это.
 – 
Shiro
5 Сен 2016 в 18:42

Вам нужен индекс, который охватывает все столбцы во всех подвыражениях OR. Для запроса, который вы разместили, вам нужно:

ALTER TABLE news ADD INDEX (ticker, market);
0
Barmar 27 Янв 2015 в 08:58
Это уже покрывается моим индексом ticker_market_date, поскольку тикер и рынок являются первыми двумя столбцами в индексе.
 – 
Shiro
29 Янв 2015 в 10:47
Наверное, я должен был догадаться об этом по названию индекса, но я не заметил предложения FORCE INDEX. Вы спросили, как создать индекс....
 – 
Barmar
29 Янв 2015 в 18:05