J'ai une très grande table MySQL avec environ 150 000 lignes de données. Actuellement, quand j'essaie de courir
SELECT * FROM table WHERE id = '1';
le code fonctionne correctement car le champ ID est l'index principal. Cependant, pour un développement récent dans le projet, je dois rechercher 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, j'en ai ajouté un, donc mysql indexe maintenant le champ, mais lorsque j'essaie d'exécuter la requête ci-dessus, il s'exécute très lentement. 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 par conséquent la requête prend de 20 à 30 minutes pour renvoyer une seule ligne.
Mes résultats EXPLAIN complets 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 jeter un coup d'œil et que le champ ID est stocké en INT alors que le champ PRODUCT_ID est stocké en VARCHAR. Serait-ce la source du problème?
la source
EXPLAIN
résultats complets ? Êtes-vous certain que c'est qu'il n'y a pas d' index? Ou est-ce que l'index est là, mais MySQL a choisi de ne pas l'utiliser?Réponses:
Ne jamais comparer
integer
àstrings
MySQL. Siid
c'est le casint
, supprimez les guillemets.la source
SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/en/show-index.html pour vérifier si les index ont été ajoutésla source
ALTER TABLE tbl ADD INDEX (col)
lieu deALTER TABLE tbl ADD INDEX col (col)
, puis en utilisantALTER TABLE tbl ADD INDEX (col)
plus d'une fois gardera l' ajout d' indices nomméscol_2
,col_3
... à chaque fois. Alors qu'en utilisant laALTER TABLE tbl ADD INDEX col (col)
2e fois, ça donneraERROR 1061 (42000): Duplicate key name 'col'
.Vous pouvez utiliser cette syntaxe pour ajouter un index et contrôler le type d'index (HASH ou BTREE).
Vous pouvez en savoir plus sur les différences entre les index BTREE et HASH ici: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
la source
Il convient de noter que plusieurs index de champs peuvent considérablement améliorer les performances de votre requête. Donc, 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 aide. Ceci est réalisé avec les éléments suivants:
En outre, l'index doit correspondre à l'ordre des champs de requête. Dans mon exemple étendu, l'index doit être (ProductID, Category) et non l'inverse.
la source
the index should match the order of the query fields
?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 comme index
Considérez que vous avez une
tbl_student
table et que vous voulezstudent_id
comme clé primaire: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
L'instruction ci-dessus créera un index ordinaire avec
student_index
nom.Créer un index unique
Ici,
student_unique_index
est le nom d'index attribué à student_id et crée un index dont les valeurs doivent être uniques (ici, null peut être accepté).Option de texte intégral
L'instruction ci-dessus créera le nom d'index Fulltext avec
student_fulltext_index
lequel vous avez besoin de MyISAM Mysql Engine.Comment supprimer des index?
Comment vérifier les index disponibles?
la source
Vous dites que vous avez un index, l'expliquer 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, cela peut être dû à:
ANALYZE TABLE
aide.Dans le cas de (2) ou (3), vous pouvez inciter MySQL à utiliser la syntaxe d' index par index , mais si vous le faites, assurez-vous d'exécuter des tests pour déterminer si cela améliore réellement les performances pour utiliser l'index lorsque vous l'indiquez. .
la source