HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Вопрос производительности базы данных и запросов к ней с течением времени становится все актуальнее. Чем больше проект и данных в таблицах и сложнее связи, тем выше вероятность столкнуться с медленной работой и нежелательными блокировками.</p>
1 <p>Вопрос производительности базы данных и запросов к ней с течением времени становится все актуальнее. Чем больше проект и данных в таблицах и сложнее связи, тем выше вероятность столкнуться с медленной работой и нежелательными блокировками.</p>
2 <p>Подобные вопросы редко касаются новичков. Но нужно знать, как работать с такими проблемами, так как в будущем с ними предстоит столкнуться. Поэтому в этом уроке разберем основные направления производительности базы данных.</p>
2 <p>Подобные вопросы редко касаются новичков. Но нужно знать, как работать с такими проблемами, так как в будущем с ними предстоит столкнуться. Поэтому в этом уроке разберем основные направления производительности базы данных.</p>
3 <h2>EXPLAIN</h2>
3 <h2>EXPLAIN</h2>
4 <p>SQL - это декларативный язык, то есть им мы описываем<strong>ЧТО</strong>хотим получить, а не<strong>КАК</strong>. Но это не устраивает машину, так как СУБД должна знать, каким образом добраться до этих данных.</p>
4 <p>SQL - это декларативный язык, то есть им мы описываем<strong>ЧТО</strong>хотим получить, а не<strong>КАК</strong>. Но это не устраивает машину, так как СУБД должна знать, каким образом добраться до этих данных.</p>
5 <p>В СУБД реализована подсистема, которая называется<strong>планировщик</strong>или<strong>scheduler</strong>. Она строит<strong>план запроса</strong>- описывает, как будут извлекаться данные, которые хранятся внутри базы. Когда планировщик строит план, он учитывает множество факторов - например, статистику обращений или информацию о количестве данных в таблицах.</p>
5 <p>В СУБД реализована подсистема, которая называется<strong>планировщик</strong>или<strong>scheduler</strong>. Она строит<strong>план запроса</strong>- описывает, как будут извлекаться данные, которые хранятся внутри базы. Когда планировщик строит план, он учитывает множество факторов - например, статистику обращений или информацию о количестве данных в таблицах.</p>
6 <p>Результат работы планировщика можно посмотреть командой EXPLAIN:</p>
6 <p>Результат работы планировщика можно посмотреть командой EXPLAIN:</p>
7 <p>Выполнение запроса идет изнутри наружу, начиная с самого сдвинутого блока. Каждая операция начинается со стрелки<em>-&gt;</em>. Затем данные, полученные на этих шагах, передаются выше - и так до самого верха. В примере выше последовательность такая:<em>Seq Scan</em>-&gt;<em>Hash</em>-&gt;<em>Seq Scan</em>. Подробнее про план читайте в статье<a>Производительность запросов в PostgreSQL - шаг за шагом</a>.</p>
7 <p>Выполнение запроса идет изнутри наружу, начиная с самого сдвинутого блока. Каждая операция начинается со стрелки<em>-&gt;</em>. Затем данные, полученные на этих шагах, передаются выше - и так до самого верха. В примере выше последовательность такая:<em>Seq Scan</em>-&gt;<em>Hash</em>-&gt;<em>Seq Scan</em>. Подробнее про план читайте в статье<a>Производительность запросов в PostgreSQL - шаг за шагом</a>.</p>
8 <h2>Индексы</h2>
8 <h2>Индексы</h2>
9 <p>План запроса можно использовать по-разному, например: переписать или разбить запрос на более эффективный. Некоторые запросы уже достаточно оптимизированы, поэтому для их ускорения используют<strong>индексы</strong>- специальную структуру внутри базы данных, которая создается, чтобы ускорить поиск. Индекс в базе данных подобен предметному указателю в любой книге:</p>
9 <p>План запроса можно использовать по-разному, например: переписать или разбить запрос на более эффективный. Некоторые запросы уже достаточно оптимизированы, поэтому для их ускорения используют<strong>индексы</strong>- специальную структуру внутри базы данных, которая создается, чтобы ускорить поиск. Индекс в базе данных подобен предметному указателю в любой книге:</p>
10 <p>Этот запрос создает индекс на таблице users по полю birthday. Теперь запросы с условием или сортировкой по birthday будут работать быстрее за счет использования индекса во время подготовки данных. Пример:</p>
10 <p>Этот запрос создает индекс на таблице users по полю birthday. Теперь запросы с условием или сортировкой по birthday будут работать быстрее за счет использования индекса во время подготовки данных. Пример:</p>
11 <p>Создание индекса не гарантирует эффективности. Многое зависит от того, правильный ли индекс создан, сколько данных в таблице, какие запросы выполняются к этой таблице, сколько уже индексов было.</p>
11 <p>Создание индекса не гарантирует эффективности. Многое зависит от того, правильный ли индекс создан, сколько данных в таблице, какие запросы выполняются к этой таблице, сколько уже индексов было.</p>
12 <p>В PostgreSQL встроено шесть разных видов индексов, которые подходят под разные ситуации. Для работы с ними нужно понимать несколько вещей:</p>
12 <p>В PostgreSQL встроено шесть разных видов индексов, которые подходят под разные ситуации. Для работы с ними нужно понимать несколько вещей:</p>
13 <ul><li>Устройство индексов. Здесь не обойтись без знания<strong>структур данных и алгоритмов</strong>. В первую очередь речь идет про<strong>сбалансированные деревья</strong>- btree</li>
13 <ul><li>Устройство индексов. Здесь не обойтись без знания<strong>структур данных и алгоритмов</strong>. В первую очередь речь идет про<strong>сбалансированные деревья</strong>- btree</li>
14 <li>Классификацию видов запросов. Например, запрос по диапазону или запрос с применением LIKE оператора - разные виды запросов, которые по-разному работают и оптимизируются</li>
14 <li>Классификацию видов запросов. Например, запрос по диапазону или запрос с применением LIKE оператора - разные виды запросов, которые по-разному работают и оптимизируются</li>
15 <li>Влияние различных конструкций SQL на план запроса. Например, ORDER BY - дорогая операция, которая часто приводит к полному перебору таблицы</li>
15 <li>Влияние различных конструкций SQL на план запроса. Например, ORDER BY - дорогая операция, которая часто приводит к полному перебору таблицы</li>
16 </ul><h2>Денормализация</h2>
16 </ul><h2>Денормализация</h2>
17 <p>Еще один подход для оптимизации называется<strong>денормализацией</strong>- процесс, обратный нормализации. В реляционной теории такого понятия нет и оно противоречит ее идеям. Но на практике этот способ активно применяется, так как за счет избыточности позволяет упростить запросы, так как данные ближе и их легче извлечь.</p>
17 <p>Еще один подход для оптимизации называется<strong>денормализацией</strong>- процесс, обратный нормализации. В реляционной теории такого понятия нет и оно противоречит ее идеям. Но на практике этот способ активно применяется, так как за счет избыточности позволяет упростить запросы, так как данные ближе и их легче извлечь.</p>
18 <p>Цена за денормализацию - дополнительный объем и иногда необходимость производить синхронизацию данных самостоятельно. Например, мы можем хранить имя пользователя в разных таблицах, что создает сложности, когда оно изменяется. Поэтому его нужно поменять во всех таблицах, где оно используется. Денормализация значительно сокращает число запросов с соединениями - joins.</p>
18 <p>Цена за денормализацию - дополнительный объем и иногда необходимость производить синхронизацию данных самостоятельно. Например, мы можем хранить имя пользователя в разных таблицах, что создает сложности, когда оно изменяется. Поэтому его нужно поменять во всех таблицах, где оно используется. Денормализация значительно сокращает число запросов с соединениями - joins.</p>
19 <p>Мы разобрали основные подходы оптимизации базы данных. Подобный вопрос редко касается новичков, но, например, на собеседовании иногда спрашивают на эту тему. Если вы дадите хороший ответ, то у вас будет больше шансов на трудоустройство.</p>
19 <p>Мы разобрали основные подходы оптимизации базы данных. Подобный вопрос редко касается новичков, но, например, на собеседовании иногда спрашивают на эту тему. Если вы дадите хороший ответ, то у вас будет больше шансов на трудоустройство.</p>
20 <p>Производительность базы данных - серьезная тема, поэтому ей посвящена не одна книга. В этом уроке мы разобрали основные направления, а остальное сможете познать на практике.</p>
20 <p>Производительность базы данных - серьезная тема, поэтому ей посвящена не одна книга. В этом уроке мы разобрали основные направления, а остальное сможете познать на практике.</p>