<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.170.74.44&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.170.74.44&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.170.74.44"/>
		<updated>2026-08-04T04:08:15Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%94%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D1%8B_%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%BE%D0%B2._%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%BE%D0%B2&amp;diff=81519</id>
		<title>Индексация данных. Другие типы индексов. Применение индексов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%94%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D1%8B_%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%BE%D0%B2._%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%BE%D0%B2&amp;diff=81519"/>
				<updated>2021-12-19T20:55:53Z</updated>
		
		<summary type="html">&lt;p&gt;188.170.74.44: Убрать &amp;quot;заметим&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Другие типы индексов ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Bitmap_1.png|мини|Пример битового индекса]]&lt;br /&gt;
===Битовый (bitmap) индекс===&lt;br /&gt;
&lt;br /&gt;
Пусть в таблице имеется колонка, способная хранить ограниченный набор значений. Битовый индекс для каждого возможного значения хранит `1`, если это значение хранится в данной строке, и `0` иначе.&lt;br /&gt;
Таким образом, количество битовых столбцов равно числу возможных значений для того столбца, по которому строится битовый индекс.&lt;br /&gt;
&lt;br /&gt;
Ускоряемые запросы:&lt;br /&gt;
* Вычисление логических выражений&lt;br /&gt;
* Запросы с `count`: требуется считать только количество единичных битов, что эффективно&lt;br /&gt;
&lt;br /&gt;
Основным недостатком битовых индексов является долгое обновление данных.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Bitmap_3.png|мини|Битовый индекс с накоплением]]&lt;br /&gt;
===Битовый индекс с накоплением===&lt;br /&gt;
&lt;br /&gt;
В случае, когда значения столбца, по которому строится битовый индекс, упорядочены, имеет место битовый индекс с накоплением. В отличии от обычного битового индекса, `1` записывается для всех значений, больше или равных заданному. Такой индекс позволяет эффективно проводить операции сравнения с константой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Bitmap_5.png|мини|Пример составного битового индекса и запроса в нём: `Gender = M and Year &amp;gt;= 3`]]&lt;br /&gt;
===Составной битовый индекс===&lt;br /&gt;
&lt;br /&gt;
Представляет из себя битовый индекс, построенный на нескольких столбцах. Каждый столбец таблицы, на котором строится индекс, соответствует своему набору столбцов в битовом индексе. При этом индексы могут быть как с накоплением, так и без: например, одному столбцу соответствует обычный битовый индекс, а другому - битовый индекс с накоплением.&lt;br /&gt;
&lt;br /&gt;
===Оптимизация битового индекса===&lt;br /&gt;
&lt;br /&gt;
Основным преимуществом битовых индексов является небольшой объём памяти для хранения, в большинстве случаев их можно хранить в памяти целиком. Кроме того, существуют техники сжатия битовых индексов:&lt;br /&gt;
* RLE-кодирование (эффективно, так как в обычных битовых индексах хранится много нулей, и максимум одна единица)&lt;br /&gt;
* Byte-aligned Bitmap Code - индексы хранятся в упакованном виде, логические операции проводятся сразу же над ними, распаковка происходит только, когда это необходимо.&lt;br /&gt;
&lt;br /&gt;
Недостатком оптимизированного хранения является сложность перестроения, что увеличивает время работы на их поддержание.&lt;br /&gt;
&lt;br /&gt;
===Размер битового индекса===&lt;br /&gt;
&lt;br /&gt;
Для несжатых битовых индексов: при различных `k` значениях и таблице с `n` строк хранение займёт `k * n` бит.&lt;br /&gt;
&lt;br /&gt;
Оценка для сжатых индексов: предположим, что мы сжимаем по RLE. Всего в индексе `n` единиц, остаётся закодировать шаги в зависимости от их размера, что всего даёт порядка `O(n \log n)` бит. Следует обратить внимание, что эта оценка никак не зависит от `k`, что позволяет строить эффективные сжатые индексы на столбцах с большим диапазоном значений.&lt;br /&gt;
&lt;br /&gt;
=== R-деревья ===&lt;br /&gt;
&lt;br /&gt;
Для индексации многомерной информации и задач пространственного поиска одной из распространённых структур являются R-деревья. Для двумерного случая данные разбиваются на прямоугольники (допускаются пересечения), для `n`-мерного случая - `n`-мерные параллелепипеды.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Other_RTree.png|thumb|center|600px|Пример R-дерева (справа) и разбиения данных]]&lt;br /&gt;
&lt;br /&gt;
Ускоряемые запросы:&lt;br /&gt;
* Диапазоны по нескольким координатам&lt;br /&gt;
* Поиск ближайших значений&lt;br /&gt;
&lt;br /&gt;
== Применение индексов ==&lt;br /&gt;
&lt;br /&gt;
===Когда используется индекс?===&lt;br /&gt;
&lt;br /&gt;
Упорядоченные индексы эффективно использовать не только на полном наборе столбцов, но и на его префиксе. Например, упорядоченный индекс по `(Name, Surname)` позволяет эффективно искать по `Name`, однако для поиска только по `Surname` данный индекс бесполезен. Также, для составных ключей можно использовать диапазоны, фиксируя префикс ключа.&lt;br /&gt;
&lt;br /&gt;
Следует отметить, что в индексах допускается хранение $null$.&lt;br /&gt;
&lt;br /&gt;
===Селективность индекса===&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Селективностью индекса''' назвается характеристика, определяющая, насколько эффективно индекс разбивает данные.&lt;br /&gt;
}}&lt;br /&gt;
Примеры селективности:&lt;br /&gt;
* Процент записей, получаемый по значению&lt;br /&gt;
* Среднее: $\operatorname{count}(distinct) / count$ - количество различных значений по отношению к общему числу значений&lt;br /&gt;
* Худшее: $\max(count) / count$ - размер максимального из значений по отношению к общему числу значений&lt;br /&gt;
&lt;br /&gt;
Примеры индексов и их селективности:&lt;br /&gt;
* Номер паспорта: высокая селективность&lt;br /&gt;
* Возраст человека: средняя селективность&lt;br /&gt;
* Пол человека: низкая селективность&lt;br /&gt;
&lt;br /&gt;
===Оценка селективности===&lt;br /&gt;
&lt;br /&gt;
Для оценивания селективности можно использовать несколько подходов. Например, опираться на статистику с предыдущих запросов или подсчитывать специальным образом.&lt;br /&gt;
&lt;br /&gt;
Например, для хеш-индексов можно использовать размеры и количество корзин. Если значение входит в корзину большого размера, вероятно, селективность индекса ниже. Для B-деревьев имеют место гистограммы распределения, построенные на верхних уровнях.&lt;br /&gt;
&lt;br /&gt;
В случае достаточно низкой селективности индексы не используются, так как в такой ситуации полное последовательное чтение таблицы эффективнее, чем несколько случайных чтений.&lt;br /&gt;
&lt;br /&gt;
===Покрывающий индекс===&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Покрывающим индексом''' назвается упорядоченный индекс, хранящий не только столбцы, по которым осуществляется поиск, но и дополнительные столбцы, загружающиеся вместе со столбцами для поиска.&lt;br /&gt;
}}&lt;br /&gt;
После поиска, для получения значений столбцов, хранящихся в покрывающем индексе, не требуется обращаться к записи - эта информация уже получена из индекса. С другой стороны, покрывающие индексы имеют повышенную высоту дерева и занимают больше памяти.&lt;br /&gt;
&lt;br /&gt;
Покрывающие индексы очень полезны при покрытии идентификаторов: ветвимость дерева уменьшается незначительно (особенно, если в столбцах для поиска есть строки), и при этом не требуется обращаться непосредственно к записям.&lt;br /&gt;
&lt;br /&gt;
===Рекомендации===&lt;br /&gt;
&lt;br /&gt;
* '''Индексы на ключи'''. Данная рекомендация очень распространённая, и многие современные СУБД автоматически их создают.&lt;br /&gt;
* '''Индексы на внешние ключи'''&lt;br /&gt;
* '''Индексы на запросы по диапазонам'''. Для таких запросов стоит рассмотреть построение упорядоченного индекса.&lt;br /&gt;
* '''Индексы таблиц связей'''. Часто используются покрывающие индексы, причём, для двух столбцов, два индекса, в оба направления (так как неизвестно, какое направление использует запрос): $(id_1, id_2)$ и $(id_2, id_1)$.&lt;br /&gt;
* '''Индексы на строки'''. Рекомендуется использовать упорядоченные индексы только если имеются массовые операции над строками (например, поиск по префиксу). При этом на строках допускаются хеш-индексы, но для запросов потребуется знать точное значение строки.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* ''Дейт К. Введение в системы баз данных (Приложение Г)''&lt;br /&gt;
* ''Кнут Д. Искусство программирования. Том 3. Сортировка и поиск''&lt;br /&gt;
* ''Silberschatz A., Korth H. F., Sudarshan S. Database System Concepts''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Базы данных]]&lt;/div&gt;</summary>
		<author><name>188.170.74.44</name></author>	</entry>

	</feed>