MySQL: почему команда объяснения дает разные результаты для одного и того же оператора SQL?
Я перенес базу данных MySQL из одной среды в другую и обнаружил, что после миграции определенный запрос выполняется крайне медленно, чем был.
Я исследовал оператор с помощью ключевого слова объяснения (ниже) и обнаружил, что команда объяснения дает разные результаты на разных серверах.
explain select distinct j.job,f.path,p.path
from fixes f
join jobs j on f.job=j.id
join paths p on p.id =f.path
where p.path like '//depot1/Dev\-trunk/%' ;
Для оригинального, это дает:
1 SIMPLE p range PRIMARY,path path 752 **19** Using where; Using index; Using temporary
1 SIMPLE f ref path,job path 8 p.p.id **6448356**
1 SIMPLE j eq_ref PRIMARY PRIMARY 8 p.f.job **1**
И тот же оператор дает различный вывод в новой среде:
1 SIMPLE j index PRIMARY job 62 **68486** Using index; Using temporary
1 SIMPLE f ref path,job job 8 p.j.id **812**
1 SIMPLE p eq_ref PRIMARY,path PRIMARY 8 p.f.path **1** Using where
1 ответ
К вашему сведению, выясняется, что при переносе базы данных для оптимизатора движка используются некоторые статистические данные, чтобы определить наилучшую стратегию, например, для объединения таблиц, которая, очевидно, не была скопирована.
Решение состоит в том, чтобы запустить ANALYZE
на каждой из таблиц, чтобы "перестроить" такую информацию. Таким образом, выполнив АНАЛИЗ для каждой таблицы и запустите explain
Команда снова выводит согласие и скорость запроса резко возрастает.