@ev09

Как ограничить Rows_examined в MYSQL с помощью LIMIT?

SELECT m.`Message_ID`, m.`Keyword`
FROM `XXX` AS m
WHERE m.`Sub_Class_ID` = 568
AND m.`Keyword` = 'BBB' LIMIT 1;
# Query_time: 5.306829 Lock_time: 0.000655 Rows_sent: 1 Rows_examined: 86744
Почему он просматривает все строки? По идеи должен найти первое совпадение и остановиться.
  • Вопрос задан
  • 32 просмотра
Пригласить эксперта
Ответы на вопрос 2
AlexMcArrow
@AlexMcArrow
Люблю РНР, да я такой!
Как MySQL выполняет ваш запрос (примерно), от лица СУБД:
Что хочет человек
SELECT m.`Message_ID`, m.`Keyword` FROM `XXX` AS m WHERE m.`Sub_Class_ID` = 568 AND m.`Keyword` = 'BBB' LIMIT 1;
?
ОК, мне нужно взять данные из таблицы `XXX`, а именно поля Message_ID и Keyword, но не просто, а с условием что: Sub_Class_ID = 568 и Keyword = 'BBB' - делаем...
Ага получил.. что еще? О, надо только одну строку, берем из того что получили - ОДНУ стркоку.

Ну я если более технически, оператор LIMIT не является условием выборки данных, а лишь последующий обработчик данных, такой же как GROUP и ORDER.
Образно - можно сказать что СУБД выполняет два запроса: получает необходимый набор данных попадающий под условие - помещает во временную таблицу и потом применяет "фильтры" - GROUP, ORDER, LIMIT.

Могу ошибаться в деталях - но суть вашей проблемы в этом.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Rows_examined - сколько строк было просмотрено запросом, а не сколько было найдено. Прежде чем найти строку подходящую по условию запрос перебирал некоторое число строк и они не подходили под условие поиска. Что с индексами на табличке?

А не читать всё, когда есть limit - умеет даже mysql.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы