В индексе clustered
для ID
строки таблицы упорядочены по ID
.
В non-clustered
индексе ID
ссылки на строки таблицы упорядочены по ID
.
Мы можем сравнить базу данных с CSV
файлом:
ID,Value
-------
1,ReallyReallyLongValue1
3,ReallyReallyLongValue2
В таблице clustered
, когда мы вставляем новую строку, нам нужно сжать ее между существующими строками:
ID,Value
-------
1,ReallyReallyLongValue1
2,ReallyReallyLongValue2
3,ReallyReallyLongValue3
, что медленно при вставке, но быстро при извлечении.
В таблице non-clustered
мы храним отдельный индексный файл, который упорядочивает наши строки:
Id,RowNumber
------------
1, 1
3, 2
Когда мы вставляем новую строку, мы просто добавляем к нашему основному файлу и обновляем файл краткого индекса:
ID,Value
-------
1,ReallyReallyLongValue1
3,ReallyReallyLongValue3
2,ReallyReallyLongValue2
Id,RowNumber
------------
1, 1
2, 3
3, 2
, что быстро при вставке, но менее эффективно при извлечении.
В реальных базах данных индексы используют более эффективные двоичные деревья, но принцип остается тем же.
Кластерные индексы быстрее на SELECT
, некластеризованные индексы быстрее на INSERT / UPDATE / DELETE