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

130

Lorsqu'une colonne entière est marquée comme clé primaire dans une table SQLite, un index doit-il également être explicitement créé 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 chercherai sur cette colonne tout le temps).

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

Marek Jedliński
la source

Réponses:

149

Il le fait pour vous.

Hormis 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 déjà soumises collectivement à une contrainte UNIQUE ou PRIMARY KEY.

hvgotcodes
la source
8
En effet, il dit "L'attribut PRIMARY KEY crée normalement un index UNIQUE sur la ou les colonnes qui sont spécifiées comme PRIMARY KEY". Cependant, cet index n'est pas visible dans les applications de gestion SQLite, c'est pourquoi j'ai demandé.
Marek Jedliński
1
Il est mentionné dans le sqlite_mastertableau avec un nom commençant par sqlite_autoindex_.
dan04 du
2
En retard, mais @NicolasZozol oui vous devez créer un UNIQUEindex (ou une UNIQUEcontrainte) sur le (s) champ (s) parent / référencé (s) s'il n'existe pas; il est recommandé que le (s) champ (s) enfant (s) de référence aient un index (qui ne sera généralement pas unique): voir ici
TripeHound
2
Hmm, la section SQL Data Constraints ici dit: Dans la plupart des cas , les contraintes UNIQUE et PRIMARY KEY sont implémentées en créant un index unique dans la base de données. (Les exceptions sont INTEGER PRIMARY KEY et PRIMARY KEY sur les tables SANS ROWID.). La réponse n'est donc pas toujours vraie?
Curiosité ludique
3
Il semble que rowid IS indexé mais implémenté différemment sqlite.org/lang_createtable.html#rowid Les données des tables rowid sont stockées sous la forme d'une structure B-Tree contenant une entrée pour chaque ligne de table, en utilisant la valeur rowid comme clé ... pour un enregistrement avec un rowid spécifique ... est environ deux fois plus rapide qu'une recherche similaire effectuée en spécifiant toute autre clé PRIMAIRE ou valeur indexée.
matreshkin
15

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 PRIMARY KEY ou valeur indexée . Ceci est dû au fait:

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

À une exception près notée ci-dessous, si une table rowid a une clé primaire qui se compose d'une seule colonne et que le type déclaré de cette colonne est "INTEGER" dans n'importe quel mélange de majuscules et minuscules, la colonne devient un alias pour 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 du 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, et non comme un alias pour le rowid.

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

Eiffel
la source
8

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

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

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

Vache à lait
la source