0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>2 дек 2019</li>
2
<ul><li>2 дек 2019</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Разбираемся, как ускорить работу базы данных приложений и сайтов, что такое индексы и как они устроены. Пособие для начинающих backend-разработчиков.</p>
4
</ul><p>Разбираемся, как ускорить работу базы данных приложений и сайтов, что такое индексы и как они устроены. Пособие для начинающих backend-разработчиков.</p>
5
<p> vlada_maestro / shutterstock</p>
5
<p> vlada_maestro / shutterstock</p>
6
<p>PHP-разработчик digital-агентства "Атвинта", в свободное время пишу на Go/C#/C++. Нравится проектировать и продумывать highload-системы.</p>
6
<p>PHP-разработчик digital-агентства "Атвинта", в свободное время пишу на Go/C#/C++. Нравится проектировать и продумывать highload-системы.</p>
7
<p><strong>об авторе</strong></p>
7
<p><strong>об авторе</strong></p>
8
<p>PHP-разработчик<a>digital-агентства “Атвинта”</a>, в свободное время пишу на Go/C#/C++. Нравится проектировать и продумывать highload-системы.</p>
8
<p>PHP-разработчик<a>digital-агентства “Атвинта”</a>, в свободное время пишу на Go/C#/C++. Нравится проектировать и продумывать highload-системы.</p>
9
<p>Базы данных - это совсем не сложно, даже новички быстро вливаются в тему и начинают работать практически без проблем. А что сложного? Есть таблицы, в них записываем строки - всё просто. Да, и всё работает, никто не жалуется. Пока не наступит момент… когда данных будет много.</p>
9
<p>Базы данных - это совсем не сложно, даже новички быстро вливаются в тему и начинают работать практически без проблем. А что сложного? Есть таблицы, в них записываем строки - всё просто. Да, и всё работает, никто не жалуется. Пока не наступит момент… когда данных будет много.</p>
10
<p>Тут нам и приходят на помощь индексы. Во всех базах данных они работают примерно по одному и тому же принципу. В этой статье я буду использовать MariaDB.</p>
10
<p>Тут нам и приходят на помощь индексы. Во всех базах данных они работают примерно по одному и тому же принципу. В этой статье я буду использовать MariaDB.</p>
11
<p>Рассмотрим на простом примере. Есть таблица<em>articles</em>со следующей структурой:</p>
11
<p>Рассмотрим на простом примере. Есть таблица<em>articles</em>со следующей структурой:</p>
12
<p>Добавим в таблицу несколько записей:</p>
12
<p>Добавим в таблицу несколько записей:</p>
13
<p>И сделаем следующий запрос:</p>
13
<p>И сделаем следующий запрос:</p>
14
<p>Ничего удивительного: простой запрос и выполняется быстро. Но что будет, если данных “чуть-чуть” больше? Давайте добавим, например, 2 млн статей.</p>
14
<p>Ничего удивительного: простой запрос и выполняется быстро. Но что будет, если данных “чуть-чуть” больше? Давайте добавим, например, 2 млн статей.</p>
15
<p>И повторим запрос на выборку:</p>
15
<p>И повторим запрос на выборку:</p>
16
<p>Как видим, время выполнения запроса увеличилось. Хоть и две секунды, но это долго. И нагрузка на диск высокая.</p>
16
<p>Как видим, время выполнения запроса увеличилось. Хоть и две секунды, но это долго. И нагрузка на диск высокая.</p>
17
<p>Создаем индекс по колонке<em>views</em>из таблицы<em>articles</em>.</p>
17
<p>Создаем индекс по колонке<em>views</em>из таблицы<em>articles</em>.</p>
18
<p>И повторяем запрос:</p>
18
<p>И повторяем запрос:</p>
19
<p>Вот! Так намного лучше. Выборка проходит так же быстро, как и с тремя записями. В чём же подвох? Как это работает и почему? Что может пойти не так?</p>
19
<p>Вот! Так намного лучше. Выборка проходит так же быстро, как и с тремя записями. В чём же подвох? Как это работает и почему? Что может пойти не так?</p>
20
<p>Что происходит, когда мы запрашиваем данные? А что вы делаете, когда ищете нужную вам строку в таблице? Да, база данных сканирует всю таблицу и выбирает те записи, которые попадают под условия.</p>
20
<p>Что происходит, когда мы запрашиваем данные? А что вы делаете, когда ищете нужную вам строку в таблице? Да, база данных сканирует всю таблицу и выбирает те записи, которые попадают под условия.</p>
21
<p>Это происходит быстро, когда у нас три записи, и долго, когда их очень много. Ведь наша таблица хранится на физическом носителе и, чтобы просмотреть её всю, нужно считать немало данных.</p>
21
<p>Это происходит быстро, когда у нас три записи, и долго, когда их очень много. Ведь наша таблица хранится на физическом носителе и, чтобы просмотреть её всю, нужно считать немало данных.</p>
22
<p>Индекс, который мы создали, представляет из себя такую структуру данных, как B-дерево. Но, например, в InnoDB используется B+-дерево. Всё зависит от подсистемы хранения, а в целом принцип их работы похож. Это дерево строится по колонке views из таблицы articles.</p>
22
<p>Индекс, который мы создали, представляет из себя такую структуру данных, как B-дерево. Но, например, в InnoDB используется B+-дерево. Всё зависит от подсистемы хранения, а в целом принцип их работы похож. Это дерево строится по колонке views из таблицы articles.</p>
23
<p>Чтобы понять, как происходит выборка с индексом, нужно знать, как работает B-дерево.</p>
23
<p>Чтобы понять, как происходит выборка с индексом, нужно знать, как работает B-дерево.</p>
24
<p>Перед нами B-дерево индекса. В каждом узле хранятся элементы со значениями; в нашем случае это значения из поля<em>views</em>. Также элементы хранят ссылку на строку в таблице.</p>
24
<p>Перед нами B-дерево индекса. В каждом узле хранятся элементы со значениями; в нашем случае это значения из поля<em>views</em>. Также элементы хранят ссылку на строку в таблице.</p>
25
<p>Поиск начинается с корневого узла. Наша задача - пройти по каждому элементу в узле и сравнить его значение с искомым:</p>
25
<p>Поиск начинается с корневого узла. Наша задача - пройти по каждому элементу в узле и сравнить его значение с искомым:</p>
26
<ul><li>Если значение совпало - берём ссылку на данные и читаем их из таблицы.</li>
26
<ul><li>Если значение совпало - берём ссылку на данные и читаем их из таблицы.</li>
27
<li>Если наше значение больше, чем значение в элементе, - идём дальше.</li>
27
<li>Если наше значение больше, чем значение в элементе, - идём дальше.</li>
28
<li>Если искомое значение меньше, чем в элементе, - нам нужно перейти в поддерево, которое хранится левее от ячейки. Далее мы попадаем на следующий уровень и итерация повторяется.</li>
28
<li>Если искомое значение меньше, чем в элементе, - нам нужно перейти в поддерево, которое хранится левее от ячейки. Далее мы попадаем на следующий уровень и итерация повторяется.</li>
29
</ul><p>Рассмотрим алгоритм на примере поиска значения 2001.</p>
29
</ul><p>Рассмотрим алгоритм на примере поиска значения 2001.</p>
30
<ul><li>Как и говорилось ранее, мы начинаем с корневого узла - первой ячейки со значением 1000.</li>
30
<ul><li>Как и говорилось ранее, мы начинаем с корневого узла - первой ячейки со значением 1000.</li>
31
<li>Так как 2001 больше 1000, то мы идём дальше.</li>
31
<li>Так как 2001 больше 1000, то мы идём дальше.</li>
32
<li>Доходим до ячейки 3000. Но 2001 меньше, чем 3000, поэтому переходим на поддерево.</li>
32
<li>Доходим до ячейки 3000. Но 2001 меньше, чем 3000, поэтому переходим на поддерево.</li>
33
<li>Первая ячейка идёт со значением 2200, наше значение меньше, значит снова переходим на левое поддерево.</li>
33
<li>Первая ячейка идёт со значением 2200, наше значение меньше, значит снова переходим на левое поддерево.</li>
34
<li>И сразу же находим ячейку со значением 2001.</li>
34
<li>И сразу же находим ячейку со значением 2001.</li>
35
</ul><p>То, что мы и искали. А так как искомая ячейка содержит ссылку на место, где лежат наши данные, то мы можем легко и быстро прочитать их.</p>
35
</ul><p>То, что мы и искали. А так как искомая ячейка содержит ссылку на место, где лежат наши данные, то мы можем легко и быстро прочитать их.</p>
36
<p>В данной структуре можно легко делать выборку по диапазонам, например<em>views >= 1000</em>. В случае таких запросов индекс также поможет.</p>
36
<p>В данной структуре можно легко делать выборку по диапазонам, например<em>views >= 1000</em>. В случае таких запросов индекс также поможет.</p>
37
<p>Хоть поиск и значительно ускорился, есть и свои нюансы. Изменения в В-дереве - не самая быстрая операция.</p>
37
<p>Хоть поиск и значительно ускорился, есть и свои нюансы. Изменения в В-дереве - не самая быстрая операция.</p>
38
<p>Чтобы придерживаться этих условий, нужно постоянно проводить перебалансировку дерева. Это и замедляет работу.</p>
38
<p>Чтобы придерживаться этих условий, нужно постоянно проводить перебалансировку дерева. Это и замедляет работу.</p>
39
<p>Если вы используете несколько десятков индексов в одной таблице, то при вставке или удалении из неё нужно проводить такие нехитрые манипуляции с деревьями. Из этого следует вывод, что не стоит увлекаться и создавать индексы по каждому полю.</p>
39
<p>Если вы используете несколько десятков индексов в одной таблице, то при вставке или удалении из неё нужно проводить такие нехитрые манипуляции с деревьями. Из этого следует вывод, что не стоит увлекаться и создавать индексы по каждому полю.</p>
40
<p>Мы рассмотрели создание индекса по одной колонке<em>(views),</em>но в базах данных одной колонкой не ограничишься. Можно создавать составные индексы. Например, если есть поле<em>views</em>и дата<em>created_at</em>, и вы хотите делать подобные запросы:<em>views = 1000 and created_at = “10.10.2019”</em>, то имеет смысл создать индекс по двум колонкам.</p>
40
<p>Мы рассмотрели создание индекса по одной колонке<em>(views),</em>но в базах данных одной колонкой не ограничишься. Можно создавать составные индексы. Например, если есть поле<em>views</em>и дата<em>created_at</em>, и вы хотите делать подобные запросы:<em>views = 1000 and created_at = “10.10.2019”</em>, то имеет смысл создать индекс по двум колонкам.</p>
41
<p>Я рассказал об устройстве индексов в базах данных достаточно, чтобы новичок смог понять, насколько важны индексы в проектировании БД. Не забывайте решать, где их стоит применять, и учиться их использовать.</p>
41
<p>Я рассказал об устройстве индексов в базах данных достаточно, чтобы новичок смог понять, насколько важны индексы в проектировании БД. Не забывайте решать, где их стоит применять, и учиться их использовать.</p>
42
<a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>
42
<a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>