отчет 5
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
Кафедра «Программная инженерия»
Лабораторная работа №5
по дисциплине «Рефакторинг баз данных и приложений» на тему
«Рефакторинг приложений с целью оптимизации запросов и индексов базы данных»
Выполнил: Студент гр. БПИ 2304
Афанасьев А.С.
2025
Цель работы
1. Изучить основные принципы оптимизации SQL-запросов.
2. Научиться выявлять узкие места в работе базы данных.
3. Освоить создание, модификацию и удаление индексов для ускорения запросов.
4. Применить знания на практике для оптимизации базы данных и приложения.
Задание
1. Ознакомьтесь с теоретическими аспектами как работают индексы в реляционных базах данных, влияние индексов на производительность SELECT, INSERT, UPDATE и DELETE запросов, распространенные проблемы в SQL-запросах (например, отсутствие индексов, избыточные JOIN-операции, SELECT * и т.д.), изучите инструменты мониторинга производительности базы данных (например, EXPLAIN, EXPLAIN ANALYZE для PostgreSQL/MySQL). 2. Используйте предоставленную базу данных или проект, содержащий примеры низкоэффективных запросов. Проведите анализ производительности текущих SQL запросов: используйте команды анализа, такие как `EXPLAIN`, чтобы понять, как запрос обрабатывается базой данных, найдите узкие места (например, полные сканирования таблиц вместо использования индексов). 3. Оптимизируйте SQL-запросы: замените неэффективные запросы (например, `SELECT *`) на более узкие выборки столбцов, уменьшите количество JOIN-операций, если это возможно, перепишите запросы для использования индексов. Сравните производительность запросов до и после оптимизации, используя инструменты анализа (например, время выполнения или EXPLAIN). 4. Добавьте индексы к таблицам для ускорения наиболее часто используемых запросов. Проверьте влияние индексов на производительность: сравните время выполнения запросов до и после добавления индексов, используйте EXPLAIN, чтобы убедиться, что индексы действительно используются. Изучите влияние индексов на операции вставки и обновления данных (INSERT, UPDATE). Удалите неиспользуемые или дублирующийся индексы, если они замедляют операции. 6. Подготовьте отчет, включающий список проблемных запросов и их анализ (до оптимизации), измененные запросы с описанием внесенных улучшений, добавленные, измененные или удаленные индексы (с пояснением причин), сравнительные результаты производительности до и после оптимизации.
Ход выполнения
Я подготовил пример лабораторной работы с проектом около 200 строк кода на Python в Visual Studio Code. Код представляет собой набор Python-скриптов, предназначенных для создания, заполнения, оптимизации и тестирования производительности базы данных SQLite.
Мы проведем рефакторинг и последовательно загрузим код на GitHub.
Рисунок 1. Исходный код
Рисунок
2. Исходный код
Р
исунок
3. Исходный код
Процесс рефакторинга.
Рисунок 4. Новая структура проекта
Рисунок 5. data_generator.py
Рисунок 6. data_generator.py
Рисунок 7. queries.py
Рисунок 8. main.py
Рисунок 9. main.py
Рисунок 10. index_manager.py
Рисунок 11. db_utils.py
Рисунок 12. db_utils.py
Рисунок 13. Вывод программы
Описание изменений
Декомпозиция монолитного кода на модули (Функциональное разделение).
Проблема (до рефакторинга): Весь код находился в одном файле (main.py). Это делало его громоздким, трудным для навигации, понимания отдельных частей и повторного использования кода. Функции для работы с базой данных, генерации данных, выполнения запросов и управления индексами были перемешаны.
Решение (рефакторинг): Код был разбит на логически связанные модули, каждый из которых помещен в отдельный файл:
db_utils.py: Выделены функции, отвечающие за установление соединения с базой данных (connect_to_db), создание таблиц (create_tables) и закрытие соединения. Это централизовало управление базой данных.
data_generator.py: Перемещена логика заполнения таблиц данными (populate_tables). Это отделило процесс инициализации данных от основной логики приложения.
queries.py: Вынесены все SQL-запросы (get_students_from_city_no_index, get_courses_in_department_inefficient и т.д.). Это сделало управление и анализ SQL-запросов более удобным.
index_manager.py: Добавлена логика для управления индексами (создание, удаление, анализ планов выполнения), что выделило функциональность, связанную с оптимизацией производительности.
main.py: Стал более высокоуровневым, координируя работу этих модулей: подключение к БД, создание таблиц, заполнение данными, запуск тестов производительности и управление индексами.
Это напрямую соответствует принципам модульности и структурирования кода. Разделение ответственности делает код более поддерживаемым и читаемым.
Улучшение читаемости и организации кода.
Проблема (до рефакторинга): Большой объем кода в одном файле затруднял его быстрое понимание и навигацию.
Решение (рефакторинг): Разбиение на файлы с понятными именами и размещение связанных функций вместе значительно улучшили читаемость и организацию кода.
Повышение возможности повторного использования кода.
Проблема (до рефакторинга): Функции были определены в одном файле, и их повторное использование в других контекстах могло быть затруднено.
Решение (рефакторинг): Выделение логически завершенных блоков кода в отдельные модули (например, функции для работы с БД в db_utils.py) повысило возможность их повторного использования как в рамках текущего проекта, так и потенциально в других.
Разделение ответственности за данные и запросы.
Проблема (до рефакторинга): Логика заполнения данных и выполнения запросов была сосредоточена в основном файле.
Решение (рефакторинг): Перемещение логики генерации данных в data_generator.py и SQL-запросов в queries.py сделало код более организованным и специализированным.
Это улучшает поддерживаемость и понятность кода, особенно при дальнейшем развитии проекта и добавлении новых функций.
Подготовка к оптимизации и тестированию.
Проблема (до рефакторинга): Код выполнял запросы и замерял время, но не было явной структуры для сравнения производительности оптимизированных и неоптимизированных запросов или для управления индексами.
Решение (рефакторинг): Создание модуля index_manager.py и структуры в main.py для запуска различных тестов (сравнение неэффективных и эффективных запросов) и анализа планов выполнения подготовило код к дальнейшей оптимизации производительности и проведению более структурированного тестирования.
Рисунок 14. Загрузка всех изменений на гит.
Вывод
В ходе выполнения лабораторной работы был проведен рефакторинг монолитного Python-скрипта, работающего с базой данных SQLite, на модульную структуру с разделением ответственности. Это позволило значительно улучшить организацию, читаемость и поддерживаемость кода, выделив логику взаимодействия с базой данных, генерации данных, управления индексами и выполнения SQL-запросов в отдельные файлы. Проведенные оптимизации SQL-запросов и использование индексов продемонстрировали существенное влияние на производительность выполнения операций выборки, что является ключевым аспектом эффективной работы с базами данных.
Ссылка на гит - https://github.com/andsee18/refactlab5
