it Завдання Є три SQL-запиту. Який із них “знищить” БД?
Є три SQL-запиту. Який із них “знищить” БД?

Є три SQL-запиту. Який із них “знищить” БД?

204
14 травня 2026 в 15:45

Перед тобою 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 і виконати запит значно швидше.


Чому це важливо

Дуже багато проблем із продуктивністю починаються саме з подібних дрібниць.


Запит може виглядати абсолютно безневинно, але при великому навантаженні перетворюватися на серйозну проблему для сервера.


Саме тому досвідчені розробники завжди думають не лише про те, “чи працює код”, але й про те, наскільки ефективно він працює.

Більше цікавих новин

Коментарі
Додати коментар

Поки що коментарів немає