Нужен ли индекс для первичного ключа в SQLite? - PullRequest
119 голосов
/ 31 июля 2010

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

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

Ответы [ 3 ]

132 голосов
/ 31 июля 2010

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

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

12 голосов
/ 23 июня 2016

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

... все строки в таблицах SQLite имеют 64-разрядный целочисленный ключ со знаком, который однозначно идентифицирует строку в ее таблице ... Поиск записи с определенным идентификатором строки или для всех записей с идентификаторами строк в указанном диапазоне примерно в два раза быстрее, чем аналогичный поиск, сделанный указанием любого другого PRIMARY KEY или индексированного значения.

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

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

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

8 голосов
/ 01 марта 2011

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

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

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

...