Необходим ли индекс для первичного ключа в SQLite?


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

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

3 108

3 ответа:

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

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

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

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

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

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

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

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

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

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