У меня есть сложный запрос MySQL, который объединяет три таблицы и сам присоединяется к одной таблице.
Есть Master и Slave, которые имеют идентичные данные и индексы. Мастер — это мощный блок по сравнению с ведомым, но запрос выполняется в 10 раз быстрее на ведомом (в период легкой нагрузки на ведущего).
Планы выполнения сильно отличаются.
Master execution plan
1, 'SIMPLE', 'table3_', 'const', 'PRIMARY', 'PRIMARY', '12', 'const', 1, 100.00, 'Using temporary; Using filesort'
1, 'SIMPLE', 'table2_', 'ref', 'PRIMARY,FK376E02E910238FCA', 'FK376E02E910238FCA', '13', 'const', 105, 100.00, 'Using where'
1, 'SIMPLE', 'table0_', 'ref', 'FK57012F937DD0DC02,FK57012F9398CD28D0', 'FK57012F9398CD28D0', '13', 'table2_.ID', 1515, 100.00, 'Using where'
1, 'SIMPLE', 'table1_', 'eq_ref', 'PRIMARY,FKE7E81F1ED170D4C9', 'PRIMARY', '8', 'table0_.FK_ID', 1, 100.00, 'Using where'
Slave execution plan
1, 'SIMPLE', 'table3_', 'const', 'PRIMARY', 'PRIMARY', '12', 'const', 1, 100.00, 'Using filesort'
1, 'SIMPLE', 'table1_', 'ref', 'PRIMARY,FKE7E81F1ED170D4C9', 'FKE7E81F1ED170D4C9', '9', 'const', 187398, 100.00, 'Using where'
1, 'SIMPLE', 'table0_', 'ref', 'FK57012F937DD0DC02,FK57012F9398CD28D0', 'FK57012F937DD0DC02', '9', 'table1_.ID', 1, 100.00, 'Using where'
1, 'SIMPLE', 'table2_', 'eq_ref', 'PRIMARY,FK376E02E910238FCA', 'PRIMARY', '12', 'table0_.FK_ID', 1, 100.00, 'Using where'
Таблицы обрабатываются в разном порядке, и главная БД использует как временную таблицу, так и сортировку по файлам, а подчиненная использует только сортировку по файлам.
Какие факторы могли привести к таким разным планам с таким разным временем выполнения?
ОБНОВИТЬ:
Возможно ли, что это связано со статистикой индекса? Я планирую запустить ANALYZE TABLE на Мастере в период небольшого объема. SHOW INDEX показывает очень разную кардинальность некоторых ключей между Master и Slave.