MYSQL LOW LIMIT VALUE МЕДЛЕННО ВНИЗ МОЕГО ЗАПРОСА

Когда я выполняю запрос ниже в MariaDB 10.1/MySQL 5.7, результаты имеют 849 строк и выполняются за 0,016 секунд.

SELECT a.*
FROM bco_dav_dm.d_ttlz_cli a
WHERE FL_ATND_FNAL = 0
AND a.ID_ATND = 218
ORDER BY A.FL_CRTR,  A.DT_PRMR_ATVC_LNHA;

Но когда я добавляю предложение LIMIT, чтобы вернуть только 1 строку, запрос выполняется за 9 секунд!!! Зачем?

Я проверил: используя LIMIT 1, запрос выполняется за 9 секунд. Используя LIMIT 2, запрос выполняется за 9 секунд. Используя LIMIT 3, запрос выполняется за 9 секунд. Используя LIMIT 4 и выше (5,6,7,8...100, 200, 300, 400), запрос выполняется за 0,016 секунд!!!

Я тестировал несколько раз, и у меня всегда один и тот же результат.

Как я буду использовать этот запрос в Web App, и мне нужна только 1 запись, я не знаю, почему LIMIT <=3 замедляет запрос!

В других сообщениях говорится, что использование более высокого OFFSET, естественно, замедляет запрос, но я не использую OFFSET.

Мой Объясните:

select_type: SIMPLE 
table:a 
type:ref    
possible_keys:ID_ATND,FL_ATND_FNAL
key:ID_ATND 
key_len:5   
ref:const   
rows:1846
Extra: Using where; Using filesort

Редакция:

Я заметил, когда я использую LIMIT 3 или ниже моего объяснения изменения

select_type: SIMPLE 
table:a 
type:ref    
possible_keys:ID_ATND,FL_ATND_FNAL
key:ORDER_BY_CRTR_DT
key_len:6
ref:const   
rows:1764
Extra: Using where

Индекс ORDER_BY_CRTR_DT является составным индексом, который я использую в своем ORDER BY

INDEX ORDER_BY_CRTR_DT(FL_CRTR, DT_PRMR_ATVC_LNHA);

1 ответ

Решение

Оптимизатор, основанный на затратах, рассматривает ситуацию немного по-разному с различными ограничениями и просто получает в этом случае просто неверное представление. Такое странное поведение вы увидите чаще и в большинстве баз данных, основанных на затратах.

Место в этом случае, где вы видите разницу, в выбранном индексе ORDER_BY_CRTR_DT а также ID_ATND в другом плане, который база данных затем использует для оценки количества строк. Видя меньшее количество строк, оптимизатор на основе затрат предполагает, что запрос выполняется быстрее (упрощенная точка зрения).

Иногда может помочь перестройка таблицы и индексов, чтобы они все имели самую последнюю информацию о данных в гистограммах, описывающих данные. Со временем результат может снова измениться из-за вставок, обновлений и удалений, в результате чего план может снова ухудшиться. Однако стабилизация плана часто достигается путем регулярного восстановления.

В качестве альтернативы вы можете принудительно использовать индекс, в результате чего оптимизатор на основе затрат будет отключен для этого плана. Это может, однако, иметь неприятные последствия, точно так же, как оптимизатор, основанный на затратах, потерпит неудачу.

Второй альтернативой является удаление индекса, который дает вам результат 9, который может быть вариантом, если он не используется или мало влияет на другие запросы.

Другие вопросы по тегам