Подсказка индекса выполнения в заявлениях об обновлении mysql Innodb - PullRequest
0 голосов
/ 29 ноября 2018

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

> show engine innodb status

, мы увидели столбец undex LATEST DETECTED DEADLOCK, в котором есть много блокировок, удерживаемых операторами update.Эти блокировки удерживаются, потому что индексированный столбец, используемый этими операторами, не является уникальным в соответствии с нашим приложением.Это очень поможет, если операторы update / delete могут использовать нужный индекс, который предотвратит тайм-ауты ожидания блокировки.

Мы используем версию Mysql 5.7, а таблицы используют движок Innodb.Существует способ заставить оператор SELECT использовать определенный индекс, но нет явного способа сделать это при обновлении / удалении согласно документации MySQL.

Подсказки индекса применяются только к операторам SELECT.(Они принимаются синтаксическим анализатором для операторов UPDATE, но игнорируются и не имеют никакого эффекта.)

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

update requests_table set is_active='t' where request_id='1' and is_active='f' ;

Нам нужен поиск по индексу по request_id, но оптимизатор использует is_active при запуске приложения. (PS: оба столбца проиндексированы, а request_id является первичным ключомздесь)

Использование объяснения по простому запросу дает request_id в качестве выбранного индекса, но при запуске приложения оптимизатор выбирает столбец is_active.

После использования функций в предложении where сформированный запрос выглядит так:

 update requests_table set is_active='t' where request_id='1' and concat(is_active,'')='f' ;

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

Я хочу знать, является ли это правильным подходом для принудительного использования индекса в операторе обновления / удаления.

PS: Вопрос довольно тихий, так какэто очень важный вопрос для нас, и я не хотел упускать ни одной детали.Извиняюсь за любые допущенные ошибки.

...