web-dev-qa-db-fra.com

Comment ajouter des index aux tables MySQL?

J'ai une très grande table MySQL avec environ 150 000 lignes de données. Actuellement, quand j'essaye de courir

SELECT * FROM table WHERE id = '1';

le code fonctionne correctement car le champ ID est l'index primaire. Cependant, récemment pour un développement dans le projet, je dois chercher dans la base de données par un autre champ. Par exemple

SELECT * FROM table WHERE product_id = '1';

Ce champ n'était pas indexé auparavant, cependant, je l'ai ajouté en tant qu'index, mais lorsque j'essaie d'exécuter la requête ci-dessus, les résultats sont très lents. Une requête EXPLAIN révèle qu'il n'y a pas d'index pour le champ product_id lorsque j'en ai déjà ajouté un et que, par conséquent, la requête prend entre 20 et 30 minutes pour renvoyer une seule ligne.

Mes résultats complets EXPLAIN sont:

| id | select_type | table | type | possible_keys        | key  | key_len | ref  | rows      | Extra       |
+----+-------------+-------+------+----------------------+------+---------+------+------+------------------+
|  1 | SIMPLE      | table | ALL  | NULL                 | NULL | NULL    | NULL |    157211 | Using where |
+----+-------------+-------+------+----------------------+------+---------+------+------+------------------+

Il peut être utile de noter que je viens de regarder et que le champ ID est stocké en tant que INT alors que le champ PRODUCT_ID est stocké en tant que VARCHAR. Cela pourrait-il être la source du problème?

379
Michael
ALTER TABLE `table` ADD INDEX `product_id` (`product_id`)

Ne comparez jamais integer à strings dans MySQL. Si id est int, supprimez les guillemets.

562
zerkms
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);
142
pabloferraz

Vous pouvez utiliser cette syntaxe pour ajouter un index et contrôler le type d'index (HASH ou BTREE).

create index your_index_name on your_table_name(your_column_name) using HASH;
or
create index your_index_name on your_table_name(your_column_name) using BTREE;

Vous pouvez en apprendre davantage sur les différences entre les index BTREE et HASH ici: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

72
Hieu Vo

Il est à noter que plusieurs index de champ peuvent considérablement améliorer les performances de votre requête. Ainsi, dans l'exemple ci-dessus, nous supposons que ProductID est le seul champ à rechercher, mais si la requête disait ProductID = 1 AND Category = 7, un index à plusieurs colonnes serait alors utile. Ceci est réalisé avec ce qui suit:

ALTER TABLE `table` ADD INDEX `index_name` (`col1`,`col2`)

De plus, l'index doit correspondre à l'ordre des champs de la requête. Dans mon exemple étendu, l'index devrait être (ProductID, Category) et non l'inverse.

53
Antony

Des index de deux types peuvent être ajoutés: lorsque vous définissez une clé primaire, MySQL la prend comme index par défaut.

Explication

clé primaire sous forme d'index

Considérez que vous avez une table tbl_student et que vous voulez student_id comme clé primaire:

ALTER TABLE `tbl_student` ADD PRIMARY KEY (`student_id`)

L'instruction ci-dessus ajoute une clé primaire, ce qui signifie que les valeurs indexées doivent être uniques et ne peuvent pas être NULL.

Spécifiez le nom de l'index

ALTER TABLE `tbl_student` ADD INDEX student_index (`student_id`)

L'instruction ci-dessus créera un index ordinaire avec student_index name.

Créer un index unique

ALTER TABLE `tbl_student` ADD UNIQUE student_unique_index (`student_id`)

Ici, student_unique_index est le nom d'index attribué à student_id et crée un index pour lequel les valeurs doivent être uniques (ici, null peut être accepté).

option de texte intégral

ALTER TABLE `tbl_student` ADD FULLTEXT student_fulltext_index (`student_id`)

L'instruction ci-dessus créera le nom de l'index Fulltext avec student_fulltext_index, pour lequel vous avez besoin de MyISAM Mysql Engine.

Comment supprimer des index?

DROP INDEX `student_index` ON `tbl_student`

Comment vérifier les index disponibles?

SHOW INDEX FROM `tbl_student`
45
Jazzzzzz

Vous dites que vous avez un index, l'explique dit le contraire. Cependant, si vous le faites vraiment, voici comment continuer:

Si vous avez un index sur la colonne et que MySQL décide de ne pas l'utiliser, il se peut que:

  1. Il existe un autre index dans la requête que MySQL juge plus appropriée d’utiliser, et il ne peut en utiliser qu’un seul. La solution est généralement un index couvrant plusieurs colonnes si leur méthode normale de récupération est une valeur de plus d'une colonne.
  2. MySQL décide qu'il y a trop de lignes correspondantes et pense qu'une analyse de table est probablement plus rapide. Si ce n'est pas le cas, un ANALYZE TABLE aide parfois.
  3. Dans les requêtes plus complexes, il décide de ne pas l'utiliser sur la base d'un plan de requête extrêmement intelligent conçu dans le plan de requête qui, pour une raison quelconque, ne correspond tout simplement pas à vos exigences actuelles.

Dans le cas de (2) ou (3), vous pouvez persuader MySQL d'utiliser l'index par index hint sytax , mais si vous le faites, assurez-vous de lancer des tests pour déterminer s'il améliore réellement les performances. utilisez l'index comme vous l'indiquez.

16
Wrikken