Инструменты пользователя

Инструменты сайта


mysql:indexs:main

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
mysql:indexs:main [2023/09/24 23:17]
werwolf
mysql:indexs:main [2023/09/24 23:29] (текущий)
werwolf
Строка 34: Строка 34:
 ==== Структура индекса ==== ==== Структура индекса ====
  
-\\ Индексы создаются для столбцов таблиц и представлений. Индексы предоставляют путь для быстрого поиска данных на основе значений в этих столбцах. Например,​ если вы создадите индекс по первичному ключу, а затем будете искать строку с данными,​ используя значения первичного ключа, то //SQL Server// сначала найдет значение индекса,​ а затем использует индекс для быстрого нахождения всей строки с данными. Без индекса будет выполнен полный просмотр (сканирование) всех строк таблицы,​ что может оказать значительное влияние на производительность.\\ Вы можете создать индекс на большинстве столбцов таблицы или представления. Исключением,​ преимущественно,​ являются столбцы с типами данных для хранения больших объектов (//LOB//), таких как //image//, //text// или //​varchar(max)//​. Вы также можете создать индексы на столбцах,​ предназначенных для хранения данных в формате //XML//, но эти индексы устроены немного иначе, чем стандартные и их рассмотрение выходит за рамки данной статьи. Также в статье не рассматриваются //​columnstore//​ индексы. Вместо этого я фокусируюсь на тех индексах,​ которые наиболее часто применяются в базах данных //SQL Server//.\\ Индекс состоит из набора страниц,​ узлов индекса,​ которые организованы в виде древовидной структуры — //​сбалансированного дерева//​. Эта структура является иерархической по своей природе и начинается с корневого узла на вершине иерархии и конечных узлов, листьев,​ в нижней части, как показано на рисунке:​\\ {{https://​habrastorage.org/​r/​w1560/​getpro/​habr/​post_images/​e35/​b8e/​5a8/​e35b8e5a8538064b22082a4e5351574a.jpg|Структура индекса}}\\ Когда вы формируете запрос на индексированный столбец,​ подсистема запросов начинает идти сверху от корневого узла и постепенно двигается вниз через промежуточные узлы, при этом каждый слой промежуточного уровня содержит более детальную информацию о данных. Подсистема запросов продолжает двигаться по узлам индекса до тех пор, пока не достигнет нижнего уровня с листьями индекса. К примеру,​ если вы ищете значение 123 в индексированном столбе,​ то подсистема запросов сначала на корневом уровне определит страницу на первом промежуточном (intermediate) уровне. В данном случае первой страница указывает на значение от 1 до 100, а вторая от 101 до 200, таким образом подсистема запросов обратится ко второй странице этого промежуточного уровня. Далее будет выяснено,​ что следует обратиться к третьей странице следующего промежуточного уровня. Отсюда подсистема запросов прочитает на нижнем уровне значение самого индекса. Листья индекса могут содержать как сами данные таблицы,​ так и просто указатель на строки с данными в таблице,​ в зависимости от типа индекса:​ кластеризованный индекс или некластеризованный.\\ \\ +\\ Индексы создаются для столбцов таблиц и представлений. Индексы предоставляют путь для быстрого поиска данных на основе значений в этих столбцах. Например,​ если вы создадите индекс по первичному ключу, а затем будете искать строку с данными,​ используя значения первичного ключа, то //SQL Server// сначала найдет значение индекса,​ а затем использует индекс для быстрого нахождения всей строки с данными. Без индекса будет выполнен полный просмотр (сканирование) всех строк таблицы,​ что может оказать значительное влияние на производительность.\\ Вы можете создать индекс на большинстве столбцов таблицы или представления. Исключением,​ преимущественно,​ являются столбцы с типами данных для хранения больших объектов (//LOB//), таких как //image//, //text// или //​varchar(max)//​. Вы также можете создать индексы на столбцах,​ предназначенных для хранения данных в формате //XML//, но эти индексы устроены немного иначе, чем стандартные и их рассмотрение выходит за рамки данной статьи. Также в статье не рассматриваются //​columnstore//​ индексы. Вместо этого я фокусируюсь на тех индексах,​ которые наиболее часто применяются в базах данных //SQL Server//.\\ Индекс состоит из набора страниц,​ узлов индекса,​ которые организованы в виде древовидной структуры — //​сбалансированного дерева//​. Эта структура является иерархической по своей природе и начинается с корневого узла на вершине иерархии и конечных узлов, листьев,​ в нижней части, как показано на рисунке:​\\ ​ 
 + 
 +{{ :mysql:​indexs:​fetch.jpg |}}\\  
 + 
 + 
 +Когда вы формируете запрос на индексированный столбец,​ подсистема запросов начинает идти сверху от корневого узла и постепенно двигается вниз через промежуточные узлы, при этом каждый слой промежуточного уровня содержит более детальную информацию о данных. Подсистема запросов продолжает двигаться по узлам индекса до тех пор, пока не достигнет нижнего уровня с листьями индекса. К примеру,​ если вы ищете значение 123 в индексированном столбе,​ то подсистема запросов сначала на корневом уровне определит страницу на первом промежуточном (intermediate) уровне. В данном случае первой страница указывает на значение от 1 до 100, а вторая от 101 до 200, таким образом подсистема запросов обратится ко второй странице этого промежуточного уровня. Далее будет выяснено,​ что следует обратиться к третьей странице следующего промежуточного уровня. Отсюда подсистема запросов прочитает на нижнем уровне значение самого индекса. Листья индекса могут содержать как сами данные таблицы,​ так и просто указатель на строки с данными в таблице,​ в зависимости от типа индекса:​ кластеризованный индекс или некластеризованный.\\ \\ 
  
 == Кластеризованный индекс == == Кластеризованный индекс ==
Строка 63: Строка 68:
 \\ Такой индекс позволяет конкретному запросу сразу получить все необходимые данные с листьев индекса без дополнительных обращений к записям самой таблицы.\\ \\  \\ Такой индекс позволяет конкретному запросу сразу получить все необходимые данные с листьев индекса без дополнительных обращений к записям самой таблицы.\\ \\ 
  
-==== Проектирование индексов ==== 
- 
-\\ Насколько полезны индексы могут быть, настолько аккуратно они должны быть спроектированы. Поскольку индексы могут занимать значительное дисковое пространство,​ вы не захотите создавать индексов больше,​ чем необходимо. В дополнение,​ индексы автоматически обновляются когда сама строка с данными обновляется,​ что может привести к дополнительным накладным расходам ресурсов и падению производительности. При проектирование индексов должно приниматься во внимание несколько соображений относительно базы данных и запросов к ней.\\ \\  
- 
-== База данных == 
- 
-\\ Как было отмечено ранее индексы могут улучить производительность системы,​ т.к. они обеспечивают подсистему запросов быстрым путем для нахождения данных. Однако,​ вы должны также принять во внимание то, как часто вы собираетесь вставлять,​ обновлять или удалять данные. Когда вы изменяете данные,​ то индексы должны также быть изменены,​ чтобы отразить соответствующие действия над данными,​ что может значительно снизить производительность системы. Рассмотрим следующие рекомендации при планировании стратегии индексирования:​\\ ​ 
- 
-  * Для таблиц которые часто обновляются используйте как можно меньше индексов. 
-  * Если таблица содержит большое количество данных,​ но их изменения незначительны,​ тогда используйте столько индексов,​ сколько необходимо для улучшение производительности ваших запросов. Однако хорошо подумайте перед использованием индексов на небольших таблицах,​ т.к. возможно использование поиска по индексу может занять больше времени,​ нежели простое сканирование всех строк. 
-  * Для кластеризованных индексов старайтесь использовать настолько короткие поля насколько это возможно. Наилучшим образом будет применение кластеризованного индекса на столбцах с уникальными значениями и не позволяющими использовать NULL. Вот почему первичный ключ часто используется как кластеризованный индекс. 
-  * Уникальность значений в столбце влияет на производительность индекса. В общем случае,​ чем больше у вас дубликатов в столбце,​ тем хуже работает индекс. С другой стороны,​ чем больше уникальных значения,​ тем выше работоспособность индекса. Когда возможно используйте уникальный индекс. 
-  * Для составного индекса возьмите во внимание порядок столбцов в индексе. Столбцы,​ которые используются в выражениях //WHERE// (к примеру,​ //WHERE FirstName = '​Charlie'//​) должны быть в индексе первыми. Последующие столбцы должны быть перечислены с учетом уникальности их значений (столбцы с самым высоким количеством уникальных значений идут первыми). 
-  * Также можно указать индекс на вычисляемых столбцах,​ если они соответствуют некоторым требованиям. К примеру,​ выражение которые используются для получения значения столбца,​ должны быть детерминистическими (всегда возвращать один и тот же результат для заданного набора входных параметров). 
  
mysql/indexs/main.1695586663.txt.gz · Последние изменения: 2023/09/24 23:17 — werwolf