web-dev-qa-db-fra.com

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

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

233
Alex Miller

La clé primaire est toujours indexée. Il en va de même pour MyISAM et InnoDB, et cela vaut généralement pour tous les moteurs de stockage prenant en charge tous les index.

277
Emil H

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

30
PSU_Kardi

Bien que cela ait été demandé en 2009, je me suis dit que je publierais une référence à 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 essentielles. 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 B-arbres. 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.

15
fyrye

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

10
Patrick Gryciuk

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

8
Rick

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)
7
guest

Il est préférable d'utiliser les index sur les colonnes fréquemment utilisées dans les clauses where et dans tout type de tri, tel que "order by". 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 avec précaution sur les colonnes FREQUEMMENT mises à jour.
  • Les index accélèrent où clauses et ordre de. N'oubliez pas de penser à 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 tableau est très petit, c’est-à-dire qu’il n’ya que quelques employés, il est pire d’utiliser un index que de le laisser de côté et de le laisser simplement analyser un tableau.

  • Les index ne sont vraiment utiles que dans les tables qui ont beaucoup de lignes.

  • Une autre chose à garder à l’esprit, c’est un inconvénient de la base de données de nos employés, c’est que si la colonne est de longueur variable, les index (ainsi que la plupart des MySQL) fonctionnent beaucoup moins efficacement.

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

4
Masood Ul Hassan

La clé primaire est toujours automatiquement indexée et unique. Veillez 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 allez créer trois index sur foo!

1
dr01