Есть 3 SQL-запроса. Какой из них “уничтожит” БД?
Перед тобой 3 SQL-запроса. На первый взгляд они похожи, но один из них способен серьёзно нагрузить базу данных. Сможешь определить какой именно?
Какой SQL “уничтожит” базу данных?
Работа с SQL — это не только умение получать данные. Очень часто проблема заключается в производительности запросов. Один и тот же результат можно получить разными способами, но некоторые запросы создают огромную нагрузку на сервер.
Именно поэтому backend-разработчики и DBA всегда внимательно следят за тем, какие запросы отправляются в базу данных.
Сегодня у тебя есть небольшая логическая задача. Ниже представлены три SQL-запроса. Все они работают с таблицей пользователей:
users
- id
- name
- email
- created_at
Представим, что в таблице находится несколько миллионов записей.
Твоя задача: определить, какой из запросов потенциально создаст самую большую нагрузку на базу данных.
Запрос №1
SELECT *
FROM users
WHERE id = 1500;
Запрос №2
SELECT *
FROM users
WHERE email = '[email protected]';
Запрос №3
SELECT *
FROM users
WHERE YEAR(created_at) = 2025;
Попробуй сначала самостоятельно подумать над ответом.
Какой запрос выглядит самым опасным для производительности?
Не спеши смотреть решение ниже.
Разбор задачи
На первый взгляд кажется, что все запросы довольно простые. Но проблема производительности SQL очень часто скрывается не в размере запроса, а в том, как именно база данных ищет данные.
Начнём с первого запроса:
SELECT *
FROM users
WHERE id = 1500;
Обычно поле id является PRIMARY KEY. Это значит, что для него автоматически создаётся индекс.
База данных очень быстро найдёт нужную запись через индекс даже при миллионах строк.
Теперь посмотрим на второй запрос:
SELECT *
FROM users
WHERE email = '[email protected]';
Если на поле email есть индекс, то запрос тоже будет работать быстро. Во многих проектах email действительно индексируется.
Но всё становится интереснее с третьим запросом:
SELECT *
FROM users
WHERE YEAR(created_at) = 2025;
Почему именно этот запрос опасен?
Проблема в использовании функции YEAR() прямо внутри условия WHERE.
Когда база данных видит такой запрос, она вынуждена применять функцию YEAR() к каждой строке таблицы.
Это означает, что индекс по полю created_at перестаёт нормально использоваться.
Вместо быстрого поиска через индекс база данных начинает полный перебор записей.
А если таблица содержит миллионы строк — сервер может получить серьёзную нагрузку.
Как написать запрос правильно?
Вместо использования YEAR() намного лучше использовать диапазон дат:
SELECT *
FROM users
WHERE created_at >= '2025-01-01'
AND created_at < '2026-01-01';
В таком случае база данных сможет использовать индекс по полю created_at и выполнить запрос значительно быстрее.
Почему это важно
Очень многие проблемы производительности начинаются именно с подобных мелочей.
Запрос может выглядеть абсолютно безобидно, но при большой нагрузке превращаться в серьёзную проблему для сервера.
Именно поэтому опытные разработчики всегда думают не только о том, “работает ли код”, но и о том, насколько эффективно он работает.
Больше интересных новостей
Задача по языку C#: Игра «Крестики Нолики» в консоли
Логика и Эффективные Алгоритмы / Задача на языке Java
Задача про круги: кажется сложной, но она очень простая!
Есть 3 SQL-запроса. Какой из них “уничтожит” БД?