Нужен ли индекс для первичного ключа в SQLite?


131

Если целочисленный столбец помечен как первичный ключ в таблице SQLite, следует ли явно создавать для него индекс? SQLite, похоже, не создает автоматически индекс для столбца первичного ключа, но, возможно, он все равно индексирует его с учетом его назначения? (Я буду искать в этом столбце все время).

Будет ли ситуация иной для строкового первичного ключа?

Ответы:


150

Он сделает это за вас.

Помимо столбцов INTEGER PRIMARY KEY, ограничения как UNIQUE, так и PRIMARY KEY реализуются путем создания индекса в базе данных (точно так же, как оператор CREATE UNIQUE INDEX). Такой индекс используется, как и любой другой индекс в базе данных, для оптимизации запросов. В результате часто нет преимуществ (но значительных накладных расходов) при создании индекса для набора столбцов, которые уже коллективно подчиняются ограничению UNIQUE или PRIMARY KEY.


8
Действительно, он говорит: «Атрибут PRIMARY KEY обычно создает УНИКАЛЬНЫЙ индекс для столбца или столбцов, которые указаны как PRIMARY KEY». Однако этот индекс не отображается в приложениях управления SQLite, поэтому я спросил.
Марек Едлински

1
Он упоминается в sqlite_masterтаблице с именем, начинающимся с sqlite_autoindex_.
dan04

2
Поздно, но @NicolasZozol да, вам нужно создать UNIQUEиндекс (или UNIQUEограничение) для родительских / ссылочных полей, если они не существуют; то рекомендуется , чтобы ребенок / ссылающееся поле (s) имеет индекс (который , как правило , не будет уникален): здесь видит
TripeHound

2
Хм, SQL Data Constraints здесь говорится: в большинстве случаев ограничения UNIQUE и PRIMARY KEY реализуются путем создания уникального индекса в базе данных. (Исключения составляют INTEGER PRIMARY KEY и PRIMARY KEY в таблицах WITHOUT ROWID.). Значит, ответ не всегда верен?
Playful Curiosity

3
Кажется, что rowid проиндексирован, но реализован по-другому sqlite.org/lang_createtable.html#rowid Данные для таблиц rowid хранятся в виде структуры B-Tree, содержащей одну запись для каждой строки таблицы, с использованием значения rowid в качестве ключа ... Поиск для записи с определенным rowid ... примерно в два раза быстрее, чем аналогичный поиск, выполненный с указанием любого другого PRIMARY KEY или индексированного значения.
Матрешкин

15

Если столбец помечен как INTEGER PRIMARY KEY, это примерно в два раза быстрее, чем аналогичный поиск, выполненный с указанием любого другого PRIMARY KEY или индексированного значения . Это потому что:

... все строки в таблицах SQLite имеют 64-битный целочисленный ключ со знаком, который однозначно идентифицирует строку в своей таблице ... Поиск записи с определенным идентификатором строки или всех записей с идентификатором строки в указанном диапазоне примерно вдвое больше быстрее, чем аналогичный поиск, выполненный с указанием любого другого ПЕРВИЧНОГО КЛЮЧА или индексированного значения.

За одним исключением, указанным ниже, если таблица rowid имеет первичный ключ, который состоит из одного столбца, и объявленный тип этого столбца - «INTEGER» в любом сочетании верхнего и нижнего регистра, тогда столбец становится псевдонимом для rowid.

Такой столбец обычно называют «целочисленным первичным ключом». Столбец PRIMARY KEY становится целочисленным первичным ключом только в том случае, если объявленное имя типа точно "INTEGER". Другие имена целочисленных типов, такие как «INT», «BIGINT», «SHORT INTEGER» или «UNSIGNED INTEGER», заставляют столбец первичного ключа вести себя как обычный столбец таблицы с целочисленным сродством и уникальным индексом, а не как псевдоним для rowid.

См .: http://www.sqlite.org/lang_createtable.html#rowid


8

База данных всегда автоматически создает индекс для уникального первичного ключа, чтобы можно было эффективно внутренне проверить его уникальность.

Создав его, он будет использовать при необходимости.

Конечно, он не всегда будет кластеризован, и вы обычно указываете в схеме, если хотите.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.