Оптимизация запросов к MySQL
В предыдущей статье я писал об оптимизации PHP, и я подумал, что полезно будет знать не только, как оптимизировать PHP-код, но и как оптимизировать запросы к MySQL, которые зачастую очень часто посылаются. Следовательно, их оптимизация может дать хороший прирост к производительности скрипта.
Не пишите запросы в цикле
Эта ошибка очень многих новичков, которые выполняют 100 запросов в цикле. Давайте посмотрим на пример такой ошибки:
<?php
for ($i = 1; $i < 100; $i++)
$result_set = $mysqli->query("SELECT * FROM `table` WHERE `id`='$id'");
?>
Ошибка эта очень серьёзная, и здесь действительно возникнут очень большие проблемы с производительностью. Подобные запросы надо выполнять так:
<?php
$result_set = $mysqli->query("SELECT * FROM `table` WHERE `id` < 100");
?>
Результат будет практически таким же (только всё сразу в одном $result_set), а скорость увеличится многократно.
При выборке указывайте только необходимые поля
В предыдущем примере мы с Вами писали: "SELECT * FROM" - это не есть хорошо, так как выборка по всем поля (*) тормозит выполнение запроса. Поэтому по возможности старайтесь выводить лишь необходимые поля, а не все сразу.
Не используйте ORDER BY RAND() в больших таблицах
Если в таблице несколько тысяч записей, то крайне не эффективно вытаскивать случайную запись с помощью ORDER BY RAND(). Гораздо лучше будет написать так:
<?php
$n_rand = mt_rand(1, $mysqli->query("SELECT MAX(id) FROM `table`"));
$result_set = $mysqli->query("SELECT * FROM `table` WHERE `id`='$n_rand'");
?>
Это было несколько замечаний по поводу того, как оптимизировать запросы к MySQL. Самое главное правило - это первое, его необходимо соблюдать всегда, иначе проблем с производительностью скрипта не избежать.
-
- Михаил Русаков
Комментарии (6):
Хм.. А если выводить все комментарии к статье, например. Как тогда доставать данные о каждом авторе не в цикле?
Ответить
Для этого есть запросы выборки сразу из нескольких таблиц: http://myrusakov.ru/sql-select-several.html
Ответить
Здравствуйте Михаил! У меня к вам такой вопрос. Как сделать так чтобы текст хранился в базе без тегов, а при выборке в текст подставлялись нужные теги или текст разбивался на параграфы. Спасибо
Ответить
Нормальными путями никак. Можно хранить текст, переводы в \n, а затем эти переводы анализировать и подставлять вместо них </p><p>, но так никто не делает, всегда хранять HTML-теги в базе.
Ответить
Почему же никто? Так например работает CMS WordPress (функция wpautop($content) проделывает эту и ещё много других замен "на лету").
Ответить
Думаю эта тема даже более важна, чем просто оптимизация Php, по той причине, что та же Joomla, являясь по сути набором php-файлов, обращается к MySQL за каждой мелочью. И оптимизация запросов к MySQL приведет к лучшим результатам, чем оптимизация кода.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.