web-dev-qa-db-fra.com

Un index est-il nécessaire pour une clé primaire dans SQLite?

Lorsqu'une colonne entière est marquée comme clé primaire dans une table SQLite, un index doit-il également être créé explicitement pour elle? SQLite ne semble pas créer automatiquement un index pour une colonne de clé primaire, mais peut-être qu'il l'indexe quand même, étant donné son objectif? (Je vais chercher sur cette colonne tout le temps).

La situation serait-elle différente pour une clé primaire de chaîne?

120
Marek Jedliński

Il le fait pour vous.

Mis à part les colonnes INTEGER PRIMARY KEY, les contraintes UNIQUE et PRIMARY KEY sont implémentées en créant un index dans la base de données (de la même manière qu'une instruction "CREATE UNIQUE INDEX"). Un tel index est utilisé comme tout autre index de la base de données pour optimiser les requêtes. Par conséquent, il n'y a souvent aucun avantage (mais une surcharge importante) à créer un index sur un ensemble de colonnes qui sont déjà collectivement soumises à une contrainte UNIQUE ou PRIMARY KEY.

133
hvgotcodes

Si une colonne est marquée INTEGER PRIMARY KEY, elle est en fait environ deux fois plus rapide qu'une recherche similaire effectuée en spécifiant toute autre clé PRIMARY ou valeur indexée . Ceci est dû au fait:

... toutes les lignes des tables SQLite ont une clé entière signée 64 bits qui identifie de manière unique la ligne de sa table ... La recherche d'un enregistrement avec un ID de ligne spécifique ou de tous les enregistrements avec des ID de ligne dans une plage spécifiée est environ deux fois supérieure à rapide comme une recherche similaire effectuée en spécifiant toute autre CLÉ PRIMAIRE ou valeur indexée.

À une exception près, si une table rowid a une clé primaire qui consiste en une seule colonne et le type déclaré de cette colonne est "INTEGER" dans tout mélange de majuscules et minuscules, alors la colonne devient un alias pour le rowid.

Une telle colonne est généralement appelée "clé primaire entière". Une colonne PRIMARY KEY ne devient une clé primaire entière que si le nom de type déclaré est exactement "INTEGER". D'autres noms de type entier comme "INT" ou "BIGINT" ou "SHORT INTEGER" ou "UNSIGNED INTEGER" font que la colonne de clé primaire se comporte comme une colonne de table ordinaire avec une affinité entière et un index unique, pas comme un alias pour le rowid.

Voir: http://www.sqlite.org/lang_createtable.html#rowid

13
eiffel

Une base de données créera toujours silencieusement un index pour une clé primaire unique afin de pouvoir vérifier en interne qu'elle est unique et efficace.

Après l'avoir créé, il l'utilisera si nécessaire.

Bien sûr, il ne sera pas toujours mis en cluster, et vous spécifiez généralement dans le schéma si vous le souhaitez.

8
CashCow