четверг, ноября 09, 2006

Не используйте условия IF в MySQL запросах

При изучении почти всех языков, начинающим разработчикам говорят: "не используйте абсолютные переходы goto", кроме языка Perl, что означает "старайтесь не использовать" или
"используйте, но крайне редко". Тоже я могу сказать и про IF в MySQL: "старайтесь не использовать конструкцию IF в MySQL запросах".
Разрабатывая внутреннюю программу для фирмы на php+mysql в силу обстоятельств мне пришлось прибегнуть к такой конструкции при запросе в MySQL:


SELECT
t1.*, t2.*, t3.*
FROM
t1, t2, t3
WHERE
IF (t1.field1 = 0,
t1.field2 = t3.field2,
t1.field3 = t2.field3
)
GROUP BY t1.field3
ORDER BY DESC



Что, на первый взгляд, спасало положение, но я проверял это на 5, максимумна 10 записях в таблице. При введение в эксплуотацию этого кода при количестве записей 200 и выше, сервер MySQL просто "вешался". Страница генерировалась от 60 до 250 секунд. Сначала я грешил что я использую слишком много запросов в внешней базе данных на другом хосте, но даже исключение этих запросов не помогло.
Как я понял дело заключается в механизме IF, т.е. код просит пройти все записи таблицы t1, где поле field1 = 0
и выбрать данные или из t2 или из t3. Получается очень долгий запрос.
Пришлось потратить больше времени и переделать структуру программы. Еще раз прихожу к выводу, что нельзя экономить на времени проектировании проекта, но это уже другая тема.

2 комментария:

Viktor комментирует...

Спасибо за совет, я как раз считал наоборот. Но теперь буду делать простой запрос :)

Dmitry комментирует...

спсб