MySQL оптимизация запросов и ускорение работы

MySQL оптимизация запросов и ускорение работы

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

Медленные запросы одна из самых частых причин проблем с базами данных: долгие загрузки страниц, высокий CPU, таймауты и падения сервиса. Ниже разберём основные ошибки и способы их исправления.

Зачем нужна MySQL оптимизация запросов

Без оптимизации MySQL может читать слишком много строк с данными, хотя нужна бывает всего одна. А также, возможно выполнение разных ненужных вычислений и прочего. Результат неоптимизированных запросов — это медленная работа даже на небольших объёмах данных.

Ошибка использования SELECT *

Не всегда нужный и правильный запрос, сделать полную выборку таблицы и не использовать все поля выборки.

SELECT * FROM users;

Теперь рассмотрим более правильный запрос:

SELECT id, name, email FROM users;

Таким образом мы вывели все необходимые нам поля не затрагивая лишнего. Тем самым уменьшили время выборки данных из mysql.

Отсутствие индексов в WHERE

Рассмотрим простой пример запроса по индексу user_id:

SELECT * FROM orders WHERE user_id = 125;

Если на нужном нам поле нет индекса то mysql будет сканировать всю таблицу, если же установить индекс при создании таблицы то выборка будет гораздо быстрее. Ранее мы уже рассказывали о том, что такое индексы в mysql на примерах.

CREATE INDEX idx_user_id ON orders(user_id);

Таким образом можно установить индекс при создании таблицы, тем самым оптимизировав таблицу для дальнейших запросов.

Использование функций в WHERE

Есть некоторые данные на которые индекс поставить невозможно либо не целесообразно. Например, если данные являются датой и временем, и применение функций при запросе немного замедлит запрос.

SELECT * FROM users WHERE YEAR(created_at) = 2024;

По этому лучше подобные данные проверять в сравнении, больше, меньше или равно.

SELECT * FROM users 
WHERE created_at >= '2025-01-01' 
AND created_at < '2026-01-01';

Теперь индекс используется корректно.

Неправильный LIKE запрос

Не критично, но в зависимости от задачи нужно также учитывать что такой запрос будет без учета индекса:

SELECT * FROM products WHERE name LIKE '%phone%';

Поиск с % в начале не использует индекс. Подробнее про like mysql на примерах вы найдете в предыдущих материалах.

SELECT * FROM products WHERE name LIKE 'phone%';

Теперь индекс может быть задействован.

Отсутствие LIMIT при запросе

При работе с таблицей где есть большие списки данных, всегда нужно учитывать LIMIT чтоб получить только определенный диапазон данных не затрагивая лишнее. Пример не самого лучшего запроса:

SELECT * FROM logs ORDER BY created_at DESC;

Теперь рассмотрим тот же запрос но уже более оптимизирован и ускоряющий работу mysql:

SELECT * FROM logs 
ORDER BY created_at DESC 
LIMIT 50;

Использование EXPLAIN для анализа запросов

Перед оптимизацией всегда используйте EXPLAIN для того чтоб понять с какой таблицей вы имеете дело:

EXPLAIN SELECT * FROM users WHERE email = 'test@learn-top.ru';

После запроса explan и получения результата обратите внимание на:

  • type — желательно ref, range, const.
  • key — используется ли индекс.
  • rows — сколько строк просматривается.

Кэширование результатов

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

  • Используйте кэш на уровне приложения.
  • Применяйте Redis или Memcached.
  • Избегайте повторных одинаковых запросов.

Теперь мы знаем, что MySQL оптимизация запросов — это не разовая задача, а постоянный процесс. Даже небольшие изменения в SQL могут дать прирост производительности в разы. Правильные индексы, грамотные WHERE условия и анализ запросов помогут вашему проекту работать быстро и стабильно. Запросов на самом деле очень много, особенно у большого проекта, и если оптимизировать каждый запрос то в целом это даст хорошую скорость.