Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

Метою роботи було навчитися знаходити і оптимізувати повільні SQL-запити у базі даних MySQL. Для цього використовувалися три великі таблиці: students_performance, courses та enrollments, кожна з яких містила понад мільйон записів. Дані були згенеровані штучно, щоб створити навантаження, подібне до реальної бази.

На першому етапі було виконано неоптимізований запит, який об’єднував усі три таблиці без фільтрів та індексів. У запиті використовувалась функція YEAR() і підзапит у частині WHERE з умовою LIKE ‘%Beginner%’. Таке рішення призвело до того, що MySQL виконував повний скан таблиць і не використовував жодних індексів. За результатами аналізу за допомогою EXPLAIN ANALYZE запит виконувався приблизно 28 секунд. Було видно, що в роботі застосовувалися вкладені цикли та створювались тимчасові таблиці для групування. Цей варіант був прикладом неефективного підходу, який не масштабується на великі обсяги даних.

Після цього запит було переписано з використанням CTE, де список курсів із рівнем складності Beginner формувався один раз у тимчасовій таблиці. Додатково були створені індекси на стовпцях student_id, course_id, grade, difficulty і name. Також у запит було додано умову фільтрації, щоб обмежити вибірку лише студентами з високими оцінками (> 80). У результаті MySQL зміг використовувати індекси для пошуку і зменшити кількість оброблених рядків майже у п’ять разів. Час виконання зменшився з 28 секунд до приблизно 3 секунд.

Для контролю плану виконання були використані підказки оптимізатора: MATERIALIZATION, NO_MERGE і USE INDEX. Вони примусили MySQL створити проміжну таблицю для CTE і використати потрібні індекси замість повного сканування. Аналіз виконання показав, що завдяки цим змінам система більше не створює зайвих тимчасових таблиць, а основні з’єднання відбуваються через індексований доступ.

Порівняння результатів показало, що оптимізований запит дає такий самий результат, але виконується приблизно у 9 разів швидше. Основними причинами покращення стали застосування індексів, фільтрація даних перед групуванням, заміна підзапиту на CTE та використання підказок оптимізатора.

У висновку можна зазначити, що завдяки оптимізації вдалося суттєво скоротити час виконання запиту та продемонструвати практичне використання EXPLAIN ANALYZE для аналізу ефективності SQL. Робота показала, що навіть прості зміни у структурі запиту можуть суттєво вплинути на продуктивність, якщо розуміти, як MySQL обробляє з’єднання та індекси

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages