HTML Diff
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 &gt;= 1000</em>. В случае таких запросов индекс также поможет.</p>
36 <p>В данной структуре можно легко делать выборку по диапазонам, например<em>views &gt;= 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>