Следующий запрос:запросов строит временную таблицу с внутренним соединением
SELECT *, t1.col AS some_col, t5.othercol AS other_col
FROM t1
JOIN t2 ON t2.id = t1.t2_id
JOIN t3 ON t3.id = t2.t3_id
JOIN t4 ON t4.id = t1.t4_id
JOIN t5 ON t5.id = t4.t5_id
ORDER BY timestamp DESC LIMIT 0, 20;
медленно и процессор. Когда я ОБЪЯСНИТЬ запрос, я вижу, что он создает временную таблицу и filesort для таблицы 3 (t3). В may_keys он говорит PRIMARY, но он не использует это (ключ NULL).
Как только я подключу t3 к LEFT JOIN, он использует первичный ключ и снова работает. Что может быть причиной этого?
показывают схемы и объяснить (s) – Drew
это всегда хорошая практика, чтобы явно выбрать столбцы вместо '*', когда вы выбираете из нескольких таблиц. –
Явно выберите cloumns вместо *, как указано выше. Создайте кластерный индекс или некластеризованный индекс для столбцов, которые используются в состоянии соединения, и заставят таблицу использовать этот индекс. Например, ИСПОЛЬЗОВАНИЕ AdventureWorks GO ВЫБЕРИТЕ КОНТАКТ ID ОТ ЛИЦА. КОНТАКТ С (ИНДЕКС (AK_Contact_rowguid)) GO –