Извините за ответ на мой собственный вопрос, но по крайней мере у меня есть ответ. Я пытаюсь написать это так, чтобы это помогло другим.
Поскольку это таблица MEMORY, я исключил проблемы ввода-вывода.
Далее, запрос является простым (постоянным) выбором по первичному ключу, поэтому он также не может быть проблемой индексации.
Следующее предположение было заблокировано. В моей заявке на эту таблицу были / были очень медленные выборки. И это может быть проблемой: медленный выбор задерживает обновления, которые задерживают другие выборки, так что в итоге этот очень простой и быстрый выбор может быть отложен.
Я проверил slow query log
и нашел два частых и медленных выбора, которые использовали эту конкретную таблицу (и другие тоже). Причиной было плохо сформированное соединение по делу:
A left join B on case
when A.x=1 then B.id=A.id2
when A.x=2 then B.id=A.id3
else B.id=0
end
вместо
A left join B on B.id = case
when A.x=1 then A.id2
when A.x=2 then A.id3
else 0
end
Оба дают одинаковый результат, но последний может использовать индекс B.id
, первый не может.
Как только я исправил эти запросы, производительность оригинального запроса была значительно улучшена: 5ms
вместо 500ms
в среднем. И 98%
быстрее, чем в среднем.
Мораль:
- используйте
slow query log
, проанализируйте его и улучшите медленные запросы
- если вы сталкиваетесь с необъяснимыми замедлениями, всегда проверяйте «перекрестные» запросы, которые замедляют ваш запрос, блокируя ту же таблицу