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

96

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

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

Теги:
indexing
primary-key

3 ответа

107
Лучший ответ

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

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

  • 6
    Действительно, он говорит: «Атрибут PRIMARY KEY обычно создает УНИКАЛЬНЫЙ индекс для столбца или столбцов, которые указаны как PRIMARY KEY». Однако этот индекс не виден в приложениях управления SQLite, поэтому я и спросил.
  • 1
    Это упоминание в таблице sqlite_master с именем, начинающимся с sqlite_autoindex_ .
Показать ещё 5 комментариев
7

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

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

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

6

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

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

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

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

Смотрите: http://www.sqlite.org/lang_createtable.html#rowid

Ещё вопросы

Сообщество Overcoder
Наверх
Меню