ОБЪЯСНЕНИЕ следующего запроса приводит к «использованию где» (что, как я понимаю, нормально):
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
Как я могу создать индекс, который позволит использовать несколько условий ИЛИ (часто их будет больше, чем два, которые я показал выше), или как я могу реструктурировать свой запрос, чтобы использовать мой индекс? Или есть другой способ оптимизировать это?
Спасибо.
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;
Вам нужен индекс, который охватывает все столбцы во всех подвыражениях OR
. Для запроса, который вы разместили, вам нужно:
ALTER TABLE news ADD INDEX (ticker, market);
FORCE INDEX
. Вы спросили, как создать индекс....
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.