У меня есть 3 таблицы innodb
, скажем, A, B и C. Есть запрос на объединение этих трех таблиц для получения результатов.
SELECT A.a, B.b, C.c
from A
join B on A.id = B.a_id
join C on C.id = B.c_id
where A.a = 'example' and B.b < 10;
В начале, когда я тестировал запрос с помощью команды «EXPLAIN», он дает мне следующий порядок:
B -- C -- A
Однако это не оптимально. Итак, я запускаю «АНАЛИЗ ТАБЛИЦЫ» для всех таблиц, и это дает мне:
A -- B -- C
, что я считаю правильным порядком.
Затем я развернул SQL в рабочей среде, и через 1 месяц план выполнения снова переключился на плохой вариант, то есть B-C-A. После этого я попытался снова запустить ANALYZE TABLE
несколько раз, хотя на этот раз результаты меня сбивают с толку. Иногда он дает мне также B--C--A, иногда он дает мне A--B--C, а иногда даже другой план выполнения.
Итак, мой вопрос:
- почему план выполнения меняется после развертывания?
- помимо закрепления плана выполнения (данные обновляются и меняются быстро, поэтому оптимальный план может измениться в будущем), есть ли способ гарантировать, что оптимальный план всегда будет обеспечиваться?