• admin
  • 17 Апр 2009
  • Рубрика: MySQL

10 простых советов по оптимизации MySQL. Окончание

Окончание вчерашнего поста - 10 простых советов по оптимизации MySQL…

6. Обязательно создавайте индексы для таблиц.

Отсутствие индекса очень сильно ухудшает производительность базы данных!
Если мы выполняем запрос:

SELECT * FROM users WHERE username = 'ivanenko';

и для таблицы users не создан индекс, то серверу приходится просмотреть все записи в таблице и сравнить каждую строку с искомой. В случае с индексом обращение происходит к специальному указателю, в котором можно быстро найти нужную запись не проверяя все строки. Для больших таблиц с тысячами записей выигрыш в производительности после создания индекса может увеличиваться в десятки раз.

Поэтому я советую создавать индексы для каждого поля, по которому происходит выборка, группировка, сортировка или объединение. Но учитывайте что индексы также занимают дисковое пространство, а также увеличивают время обновления записей и добавления новых (потому что изменения будут сохраняться не только в самой таблице, но и в индексном файле. Точное решение - использовать индексные файлы в той или иной реализации можно принимать только после сравнения результатов тестов на быстродействие при помощи утилит, которые рекомендовались в первых двух пунктах статьи.

7. SQL - не язык программирования

Об этом простом факте любят забывать привыкшие к таким языкам как C++ или Delphi программисты. Для создания эффективных запросов к базе данных нужно мыслить не категориями данных и производимых над ними действий, а категориями множеств и отношениями между ними. Например, привычный к вложенным циклам программист не заметит ничего в таком запросе:

1
2
3
4
5
6
SELECT a.id,
    (SELECT MAX(created)
    FROM posts
    WHERE author_id = a.id)
AS latest_post
FROM authors a

но я бы советовал заменить его на такой:

1
2
3
4
5
SELECT a.id, MAX(p.created) AS latest_post
FROM authors a
INNER JOIN posts p
    ON (a.id = p.author_id)
GROUP BY a.id

8. Правильно выбирайте storage engine

Важным также является правильный выбор наиболее подходящего для ваших задач storage engine (драйвер, который отвечает за физическое хранение вашей базы данных на диске). Их существует уже ни так и мало (анонс: об одном из наиболее оригинальных PHP storage engine я расскажу на блоге в ближайшее время), но основными являются MyISAM и InnoDB. У каждого есть свои плюсы и минусы. Для большинства достаточно знать что MyISAM больше подходит для баз данных, которые чаще используются для чтения и InnoDB лучше справляется с сохранением больших объемов данных.

Есть также и другие отличия, которые часто удобно показывать на примере запроса count().
Дело в том, что MyISAM ведет свой внутренний кеш для табличных мета-данных, в который сохраняется дополнительная информация о таблице, такая как количество записей в ней.
Поэтому для выполнения запроса count() при использовании MyISAM не происходит обращения к самой таблице - готовый ответ берется из метаданных. В то время как InnoDB приходится считать записи в таблице. Если вы все-таки используете InnoDB ради других преимуществ, которые дает именно этот storage engine (например ради хранимых процедур) и вам нужна count(), то вы можете использовать опцию SQL_CALC_FOUND_ROWS и таким образом заставить MySQL подсчитать количество рядов во время выполнения запроса. Потом это количество можно будет получить при помощи SELECT FOUND_ROWS().

9. Используйте расширения MySQL

В MySQL доступны многие расширения SQL, которые позволяют увеличить быстродействие во многих часто встречающихся задачах. Одними из наиболее полезных я считаю INSERT … SELECT, INSERT … ON DUPLICATE KEY UPDATE, REPLACE и INSERT DELAYED.

Использование этих расширений позволяет уменьшить количество запросов к базе данных в два-три раза. Последний запрос insert delayed указывает на “несрочность” сохранения записи (т.е. разрешает в случае высокого уровня нагрузки сохранить запись чуть позже когда освободятся ресурсы.

10. Последнее и самое важное.

Не ограничивайтесь этой краткой статьей - читайте официальную документацию и статьи посвященные оптимизации быстродействия MySQL и вы сможете добиться от ваших программ максимального быстродействия.

Если вам понравился этот сайт, вы можете подписаться на rss

Отзывы: Комментариев нет

Ваш отзыв

Имя (*)

E-mail (*)

Сайт

Сообщение

Архивы