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?
ALTER TABLE `table` ADD INDEX `product_id` (`product_id`)
Ne comparez jamais integer
à strings
dans MySQL. Si id
est int
, supprimez les guillemets.
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);
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
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.
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`
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:
ANALYZE TABLE
aide parfois.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.