<?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=Arimionim</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=Arimionim"/>
		<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/Arimionim"/>
		<updated>2026-05-19T18:58:31Z</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81667</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81667"/>
				<updated>2021-12-20T02:15:57Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: /* Побитное расширяемое хеширование */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k}$ последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально $O$(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== $B$ и $B+$ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до $n$ детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* $B+$ меньше данных в узлах - сильнее ветвятся&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;
** Храним ключи всех элементов&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;
Строки опасно использовать в качестве индекса, может сильно вырости высота дерева&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;
* Проверка существования ключа&lt;br /&gt;
* Поиск по ключу&lt;br /&gt;
* Минимум и максимум среди значений, на которых построен ключ&lt;br /&gt;
* Диапазон &lt;br /&gt;
** Загрузка&lt;br /&gt;
** count. count * работает быстроее, так как не нужно идти по всем данным&lt;br /&gt;
* Если построен на строках, like по префиксу&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>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81666</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81666"/>
				<updated>2021-12-20T02:15:14Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: /* Упорядоченные индексы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально $O$(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== $B$ и $B+$ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до $n$ детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* $B+$ меньше данных в узлах - сильнее ветвятся&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;
** Храним ключи всех элементов&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;
Строки опасно использовать в качестве индекса, может сильно вырости высота дерева&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;
* Проверка существования ключа&lt;br /&gt;
* Поиск по ключу&lt;br /&gt;
* Минимум и максимум среди значений, на которых построен ключ&lt;br /&gt;
* Диапазон &lt;br /&gt;
** Загрузка&lt;br /&gt;
** count. count * работает быстроее, так как не нужно идти по всем данным&lt;br /&gt;
* Если построен на строках, like по префиксу&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>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81665</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81665"/>
				<updated>2021-12-20T02:14:54Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: /* B и B+ деревья */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально O(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== $B$ и $B+$ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до $n$ детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* $B+$ меньше данных в узлах - сильнее ветвятся&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;
** Храним ключи всех элементов&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;
Строки опасно использовать в качестве индекса, может сильно вырости высота дерева&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;
* Проверка существования ключа&lt;br /&gt;
* Поиск по ключу&lt;br /&gt;
* Минимум и максимум среди значений, на которых построен ключ&lt;br /&gt;
* Диапазон &lt;br /&gt;
** Загрузка&lt;br /&gt;
** count. count * работает быстроее, так как не нужно идти по всем данным&lt;br /&gt;
* Если построен на строках, like по префиксу&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>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81664</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81664"/>
				<updated>2021-12-20T02:14:10Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально O(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== B и B+ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* B+ меньше данных в узлах - сильнее ветвятся&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;
** Храним ключи всех элементов&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;
Строки опасно использовать в качестве индекса, может сильно вырости высота дерева&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;
* Проверка существования ключа&lt;br /&gt;
* Поиск по ключу&lt;br /&gt;
* Минимум и максимум среди значений, на которых построен ключ&lt;br /&gt;
* Диапазон &lt;br /&gt;
** Загрузка&lt;br /&gt;
** count. count * работает быстроее, так как не нужно идти по всем данным&lt;br /&gt;
* Если построен на строках, like по префиксу&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>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81663</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81663"/>
				<updated>2021-12-20T02:12:31Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: /* Ускоряемые запросы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально O(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== B и B+ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* B+ меньше данных в узлах - сильнее ветвятся&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;
** Храним ключи всех элементов&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;
Строки опасно использовать в качестве индекса, может сильно вырости высота дерева&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;
* Проверка существования ключа&lt;br /&gt;
* Поиск по ключу&lt;br /&gt;
* Минимум и максимум среди значений, на которых построен ключ&lt;br /&gt;
* Диапазон &lt;br /&gt;
** Загрузка&lt;br /&gt;
** count. count * работает быстроее, так как не нужно идти по всем данным&lt;br /&gt;
* Если построен на строках, like по префиксу&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81662</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81662"/>
				<updated>2021-12-20T02:10:01Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально O(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== B и B+ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* B+ меньше данных в узлах - сильнее ветвятся&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;
** Храним ключи всех элементов&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;
Строки опасно использовать в качестве индекса, может сильно вырости высота дерева&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;
* Проверка существования ключа&lt;br /&gt;
* Поиск по ключу&lt;br /&gt;
* Минимум и максимум&lt;br /&gt;
* Диапазон&lt;br /&gt;
** Загрузка&lt;br /&gt;
** count&lt;br /&gt;
* like по префиксу&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81661</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81661"/>
				<updated>2021-12-20T02:08:29Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально O(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== B и B+ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* B+ меньше данных в узлах - сильнее ветвятся&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;
** Храним ключи всех элементов&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;
Строки опасно использовать в качестве индекса, может сильно вырости высота дерева&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;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81658</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81658"/>
				<updated>2021-12-20T01:59:12Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''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;
** Поиск в упорядоченной последовательности&lt;br /&gt;
&lt;br /&gt;
Деревья поиска&lt;br /&gt;
* Количество операций&lt;br /&gt;
** Обычно пропорционально O(высоты)&lt;br /&gt;
** Минимизировать высоту&lt;br /&gt;
* Размер узла&lt;br /&gt;
** Хотим эффективно использовать страницы&lt;br /&gt;
** Сильно ветвящиеся деревья, так размер узла будет ~странице и высота будет минимальной&lt;br /&gt;
&lt;br /&gt;
=== B и B+ деревья ===&lt;br /&gt;
&lt;br /&gt;
* $B$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели и ключи хранятся в узлах&lt;br /&gt;
* $B+$ деревья степени $n$&lt;br /&gt;
** От $\frac{n}{2}$ до n детей&lt;br /&gt;
** Указатели хранятся в листьях&lt;br /&gt;
&lt;br /&gt;
* B+ меньше данных в узлах - сильнее ветвятся&lt;br /&gt;
* B+ на одну страницу глубже&lt;br /&gt;
&lt;br /&gt;
Мы храним корень и несколько первых уровней в памяти для быстрого обращения&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81654</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81654"/>
				<updated>2021-12-20T01:49:29Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''exist'' - только если есть все необходимые атрибуты&lt;br /&gt;
**''count'' - зачастую можно посчитать по индексу count, не обращаясь к самим записям&lt;br /&gt;
*Поиск по ключу&lt;br /&gt;
**Естественные соединения&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81652</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81652"/>
				<updated>2021-12-20T01:46:22Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;br /&gt;
&lt;br /&gt;
=== Ускоряемые запросы ===&lt;br /&gt;
&lt;br /&gt;
*Проверка существования ключа&lt;br /&gt;
**Проверка повторений (ключи)&lt;br /&gt;
**''in''&lt;br /&gt;
**''exist''&lt;br /&gt;
**''count''&lt;br /&gt;
*Поиск по ключу&lt;br /&gt;
**Естественные соединения&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81650</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81650"/>
				<updated>2021-12-20T01:43:11Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование ===&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81649</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81649"/>
				<updated>2021-12-20T01:42:46Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.png|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
* разделим страницы, которые на нее ссылались, на несколько групп&lt;br /&gt;
* Каждой такой группе выделим по странице&lt;br /&gt;
&lt;br /&gt;
Стоимость - 1 чтение и запись стольких страниц, на сколько мы разделили (обычно 2)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;br /&gt;
&lt;br /&gt;
=== Побитное расширяемое хеширование&lt;br /&gt;
&lt;br /&gt;
*Глубина хеша $n$&lt;br /&gt;
** Создадим $2^n$ корзин&lt;br /&gt;
* Для каждой страницы хранится ее локальная глубина $k$&lt;br /&gt;
** Это значит что она хранит $2^{n−k} последовательных корзин на странице&lt;br /&gt;
** Может быть разной для разных страниц&lt;br /&gt;
* При переполнении происходит разделение корзин&lt;br /&gt;
** Страница глубины $k$ разделяется на две глубины $k+1$&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81644</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81644"/>
				<updated>2021-12-20T01:31:40Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;br /&gt;
[[Файл:Index_Hash_Simple.jpg|мини|Простой хеш-индекс]]&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;
[[Файл:Index_Hash_Sequence.png|мини|Цепочки страниц]]&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;
[[Файл:Index_Hash_Extendable.png|мини|Расширяемое хеширование]]&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Hash_Extendable.png&amp;diff=81643</id>
		<title>Файл:Index Hash Extendable.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Hash_Extendable.png&amp;diff=81643"/>
				<updated>2021-12-20T01:30:24Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Hash_Sequence.png&amp;diff=81641</id>
		<title>Файл:Index Hash Sequence.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Hash_Sequence.png&amp;diff=81641"/>
				<updated>2021-12-20T01:23:06Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Hash_Simple.png&amp;diff=81640</id>
		<title>Файл:Index Hash Simple.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Hash_Simple.png&amp;diff=81640"/>
				<updated>2021-12-20T01:19:35Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81639</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81639"/>
				<updated>2021-12-20T01:02:26Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&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;
* Поиск в индексе&lt;br /&gt;
** Просмотр корзины&lt;br /&gt;
** Несколько ключей в корзине. Коллизии могут быть, так как индекс не всегда ключ.&lt;br /&gt;
* Заголовок помещяется в памяти&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81638</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81638"/>
				<updated>2021-12-20T00:51:43Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини|Кластеризованный индекс]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;br /&gt;
&lt;br /&gt;
=== Структура Индекса ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Structure.png|мини|Структура индекса]]&lt;br /&gt;
&lt;br /&gt;
В общем случае индексы хранят отображение из ключей на идентификаторы записей, которые ведут на записи, которые мы загружаем&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81637</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%A3%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B8_%D1%85%D0%B5%D1%88-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B&amp;diff=81637"/>
				<updated>2021-12-20T00:46:51Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: /* Кластеризованный индекс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
** Требуется предварительная обработка таблицы как при построении, так и при обновлении&lt;br /&gt;
** Быстрый поиск в индексе, сразу получаем указатель на запись&lt;br /&gt;
&lt;br /&gt;
=== Кластеризованный индекс ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Index_Clustered.png|мини]]&lt;br /&gt;
&lt;br /&gt;
Если данные в таблице хранятся в порядке индекса, то такой индекс называется '''кластеризованным'''. Кластеризованный индекс позволяет увеличить скорость просмотра, однако так хранить данные возможно только если в таблице есть всего один индекс.&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Clustered.png&amp;diff=81636</id>
		<title>Файл:Index Clustered.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Clustered.png&amp;diff=81636"/>
				<updated>2021-12-20T00:38:30Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Structure.png&amp;diff=81635</id>
		<title>Файл:Index Structure.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Index_Structure.png&amp;diff=81635"/>
				<updated>2021-12-20T00:37:57Z</updated>
		
		<summary type="html">&lt;p&gt;Arimionim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Arimionim</name></author>	</entry>

	</feed>