La clé primaire est-elle automatiquement indexée dans MySQL?

243

Avez-vous besoin de créer explicitement un index, ou est-ce implicite lors de la définition de la clé primaire? La réponse est-elle la même pour MyISAM et InnoDB?

Alex Miller
la source

Réponses:

294

La clé primaire est toujours indexée. Ceci est le même pour MyISAM et InnoDB, et est généralement vrai pour tous les moteurs de stockage qui prennent en charge les index.

Emil H
la source
5
Si la clé primaire est toujours indexée, pourquoi les gens, lorsqu'ils parlent d'architecture / de performance de base de données, conseillent-ils toujours aux nouveaux venus SQL de "s'assurer que leur base de données est correctement indexée"?
tim peterson
35
@tim: Ils demandent aux utilisateurs de s'assurer que toutes les autres colonnes utilisées pour le filtrage, le regroupement ou le tri ont également des indices.
Emil H
15
N'oubliez pas les jointures aussi! Les champs de jointure indexés accélèrent les choses.
JustJohn
31

Selon http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html, il semblerait que ce soit implicite

ist_lion
la source
1
J'ai trouvé ce lien en cherchant avant de poser la question. Mais cela ne semble pas impliquer cela ou autre chose à propos de cette question pour moi.
Alex Miller
La page liée à cette réponse ne semble pas dire si une clé primaire est également un index. Les pages liées à la réponse de @fyrye sont plus pertinentes.
George Hawkins,
16

Même si cela avait été demandé en 2009, je pensais publier une référence réelle à la documentation MySQL sur les clés primaires. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

La clé primaire d'une table représente la colonne ou l'ensemble de colonnes que vous utilisez dans vos requêtes les plus importantes. Il a un index associé, pour des performances de requête rapides

Pour la référence MySQL 5.0, voir: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

La plupart des index MySQL ( PRIMARY KEY , UNIQUE, INDEX et FULLTEXT) sont stockés dans des arborescences B. Les exceptions sont que les index sur les types de données spatiales utilisent des arbres R et que les tables MEMORY prennent également en charge les index de hachage.

fyrye
la source
11

La clé primaire est implicitement indexée pour MyISAM et InnoDB. Vous pouvez le vérifier en utilisant EXPLAIN sur une requête qui utilise la clé primaire.

Patrick Gryciuk
la source
9

Vous n'avez pas besoin de créer explicitement un index pour une clé primaire ... c'est fait par défaut.

Meule
la source
8

Je suppose que c'est la réponse

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)
client
la source
7

Les index sont mieux utilisés sur les colonnes qui sont fréquemment utilisées dans les clauses where et dans tout type de tri, tel que "classer par". Vous travaillez peut-être sur une base de données plus complexe, il est donc bon de se rappeler quelques règles simples.

  • Les index ralentissent les insertions et les mises à jour, vous devez donc les utiliser soigneusement sur les colonnes qui sont mises à jour FRÉQUEMMENT.
  • Les index accélèrent les clauses where et trient par. N'oubliez pas de réfléchir à la façon dont vos données seront utilisées lors de la création de vos tables. Il y a quelques autres choses à retenir. Si votre table est très petite, c'est-à-dire seulement quelques employés, il est pire d'utiliser un index que de le laisser de côté et de le laisser faire un scan de table.

  • Les index ne sont vraiment utiles que pour les tableaux qui contiennent beaucoup de lignes.

  • Une autre chose à retenir, qui est un inconvénient dans la situation de la base de données de nos employés, est que si la colonne est de longueur variable, les index (ainsi que la plupart de MySQL) fonctionnent beaucoup moins efficacement.

  • N'oubliez pas les jointures aussi! Les champs de jointure indexés accélèrent les choses.

Masood Ul Hassan
la source
4

La clé primaire est toujours automatiquement indexée et unique. Attention donc à ne pas créer d'index redondants.

Par exemple, si vous avez créé une table en tant que telle

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

parce que vous voulez indexer la clé primaire et y appliquer une contrainte d'unicité, vous finirez par créer trois index foo!

dr_
la source
0

On peut considérer une colonne de clé primaire comme n'importe quelle autre colonne indexée avec les contraintes de clé primaire.

Dans la plupart des cas d'utilisation, nous avons besoin à la fois de la clé primaire et des colonnes / colonnes indexées dans une table, car nos requêtes sur la table peuvent filtrer les lignes en fonction de la colonne / colonnes qui n'est pas la clé primaire, dans ce cas, nous indexons généralement ces colonnes / colonnes ainsi que.

Anshul Sharma
la source