|
Тема |
Въпрос за избор на индекси в MySQL |
|
Автор |
dzver (чатер) |
|
Публикувано | 31.05.09 12:39 |
|
|
Имам заявка, която се генерира в зависимост от разни условия.
SELECT
FROM a
JOIN b on a.b_id = b.b_id
LEFT JOIN c on a.c_id = b.c_id
LEFT JOIN d on b.d_id = d.d_id
ORDER BY b.some_date
Не пействам самата заявка, но това е основата. Проблемът е, че вместо да ползва индекса по some_date, mysql прави temporary и filesort и убива заявката.
SELECT
FROM a
JOIN b USE INDEX (ix_some_date) on a.b_id = b.b_id
LEFT JOIN c on a.c_id = b.c_id
LEFT JOIN d on b.d_id = d.d_id
ORDER BY b.some_date
Работи коректно.
SELECT
FROM a
JOIN b on a.b_id = b.b_id
LEFT JOIN c on a.c_id = b.c_id
LEFT JOIN d on b.d_id = d.d_id
LEFT JOIN e on a.id = e.a_id
LEFT JOIN e on b.id = f.b_id
ORDER BY b.some_date
Добавянето на 4-ти и 5-ти join водят до това, че индекса се ползва правилно. Добавянето на 7-и join води до невъзможност да се изпълнят заявките.
Промяната на order by:
order by g.some_date, b.some_date
води до неупотреба на индексите по 2-те полета за дата, като заявката се забавя поносимо.
Всички таблици имат самостоятелни индекси по ID и ордер полетата, Unique key по уникалностите им.
Основните таблици a и b са 140 000 записа и 1600 записа, другите са таблици са малки - ключ-стойност.
Всички опити да премахна 1 от абсолютно безполезните join-ове водят до незабавно умиране на сървъра :)
Таблиците са MyISAM. MySQL е 5.0
SOS?Редактирано от dzver на 31.05.09 13:37.
|
| |
|
|
|