467 votes

Comment ajouter des index pour les tables MySQL?

J'ai une très grande table MySQL avec environ 150 000 lignes de données. Actuellement, lorsque j'essaie de l'exécuter

SELECT * FROM table WHERE id = '1'; 

le code fonctionne très bien tant que le champ ID est l'index primaire. Cependant, récemment, pour un développement dans le projet, je recherche la base de données par un autre champ. Par exemple

SELECT * FROM table WHERE product_id = '1';

Ce champ n'a pas été préalablement indexés, cependant, je l'ai ajouté comme un indice, mais lorsque j'essaie d'exécuter la requête ci-dessus, le résultat est très lent. Un EXPLIQUER requête révèle qu'il n'existe pas d'indice pour le product_id champ lorsque je l'ai déjà ajouté un et comme un résultat de la requête prend n'importe où de 20 à 30 minutes pour retourner une seule ligne.

EDIT:

Mon plein EXPLIQUER les résultats sont les suivants:

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

EDIT2:

Il pourrait être utile de noter que je viens de prendre un coup d'oeil et le champ ID est stocké en tant que INT alors que le PRODUCT_ID champ est stocké comme VARCHAR. Cela pourrait-il être la source du problème?

707voto

zerkms Points 105994
ALTER TABLE `table` ADD INDEX `product_id` (`product_id`)

Ne jamais comparer integer de strings dans mysql. Si id est int = supprimer les guillemets.

168voto

pzerocool Points 289
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);

93voto

Hieu Vo Points 378

vous pouvez utiliser cette syntaxe pour ajouter des index et de contrôler le type d'index (dièse ou un ARBRE)

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 l'ARBRE et le HACHAGE des indices ici: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

17voto

Wrikken Points 37727

Vous dites que vous avez un indice, l'expliquer, dit le contraire. Toutefois, si vous avez vraiment le faire, comment continuer:

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

  1. Il y a un autre indice dans la requête MySQL juge la plus appropriée à utiliser, et il peut utiliser qu'un seul. La solution est généralement un index sur plusieurs colonnes si leur méthode normale de récupération est, en valeur, de plus d'une colonne.
  2. MySQL décide il y a de nombreuses lignes correspondantes, et pense un tablescan est probablement plus rapide. Si ce n'est pas le cas, parfois, un ANALYZE TABLE aide.
  3. Dans des requêtes plus complexes, il décide de ne pas l'utiliser basée sur les extrêmement intelligente de la pensée vaudou dans la requête-plan que pour une raison tout simplement pas adaptée à vos besoins actuels.

Dans le cas de (2) ou (3), vous pourriez coaxial MySQL en utilisant l'indice de indice de indice sytax, mais si vous le faites, assurez-vous de faire quelques tests pour déterminer si elle améliore réellement les performances de l'utilisation de l'index comme vous le soupçon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X