Почему оператор update всегда сканирует диапазон индекса? - PullRequest
0 голосов
/ 13 марта 2020

Рассмотрим это UPDATE утверждение:

UPDATE `messages` force index (primary)
SET `isDeleted`=1
WHERE `messages`.`id` = '069737b6-726d-4f5b-a5b9-0510acdd7a92';

Вот график объяснения для него:

explain graph screenshot

Почему это так просто запрос использует сканирование диапазона индекса вместо выборки по одной строке или, по крайней мере, по уникальной выборке ключа? Обратите внимание, что я использую FORCE INDEX, и точно такой же запрос, написанный как оператор SELECT, приводит к сканированию "Однорядная (постоянная)".

То же самое происходит, если я добавляю LIMIT 1

I пользуюсь mysql 5.6.46

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Указатель - красная сельдь. Я думаю, что это из-за внутренних различий между SELECT и UPDATE, особенно когда речь идет о планировании запроса.

Предлагаю вам сообщить об ошибке.

Я думаю, что это не совсем так делает "диапазон". Вы можете получить некоторую уверенность в этом, выполнив:

FLUSH STATUS;
UPDATE ... ;
SHOW SESSION STATUS LIKE 'Handler%';

(я проверил множество версий; ничто не намекает на то, что поражается более 1 строки, кроме сомнительного "диапазона".)

1 голос
/ 13 марта 2020

MySQL игнорирует подсказки индекса в инструкциях UPDATE.

Поэтому нет способа детерминистически установить метод сканирования для запроса UPDATE.

Я полагаю, что должен положиться на MySQL ' s эвристика при определении того, какой метод сканирования быстрее в зависимости от размера таблицы и т. д. c. Не идеально, потому что я не знаю, каков будет профиль производительности для этого запроса, но я надеюсь, что это будет, по крайней мере, «сканирование диапазона индекса» и ничего хуже ...

Ссылка: Как заставить mysql запрос ОБНОВИТЬ использовать индекс? Как включить механизм mysql для автоматического использования индекса вместо его принудительного использования?

https://dba.stackexchange.com/a/153323/146991

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