Comment puis-je ajouter des indices de 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.
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 |
+----+-------------+-------+------+----------------------+------+---------+------+------+------------------+
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?
- Pouvez-vous publier
EXPLAIN
résultats? Êtes-vous certain, c'est qu'il y a n index? Ou est l'indice de là, mais MySQL est le choix de ne pas l'utiliser? - Une grande table serait de 150 000 000 dossiers. Une très grande table a 15,000,000,000 enregistrements. Une table de taille moyenne est de 150 000. Pour référence future.
- Sachez que " OU " peut faire MySql de ne pas utiliser les index. J'ai eu une requête avec 3 OU de l'. Chaque mached un index, et a couru dans les 15ms, Tous ensemble, pris entre 25sec et le délai d'expiration. J'ai donc fait 3 requêtes et de l'UNION ed ensemble, il a également pris 15ms sur 500.000 lignes.
Vous devez vous connecter pour publier un commentaire.
Ne jamais comparer
integer
àstrings
dans MySQL. Siid
estint
, supprimer les guillemets.SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/en/show-index.html pour vérifier si les indices ont été ajoutésshow create table
4. quelques statistiques sur la quantité de données dans la table, la façon dont le cardinal est la sélectionmysql
le manipuler...ANALYZE TABLE
en cas de besoin), ce qui peut augmenter leurs pages web pour obtenir plus fiable (au détriment de plus le calcul de celles-ci). Si tout cela échoue, et vous êtes vraiment bien sûr, et intimement connaissez vos données, leUSE / FORCE INDEX
sont à votre disposition, mais cela signifie que vous serez obligé de vérifier si cela fonctionne mieux tous les X quantité de temps à partir de là.ALTER TABLE tbl ADD INDEX (col)
au lieu deALTER TABLE tbl ADD INDEX col (col)
, puis à l'aideALTER TABLE tbl ADD INDEX (col)
plus d'une fois continuez d'ajouter des indices nommécol_2
,col_3
,... à chaque fois. Tandis que l'utilisation deALTER TABLE tbl ADD INDEX col (col)
2ème fois, donneraERROR 1061 (42000): Duplicate key name 'col'
.Vous pouvez utiliser cette syntaxe pour ajouter un index et de contrôler le type d'index (dièse ou un ARBRE).
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
Il est intéressant de noter que plusieurs indices permettent d'améliorer considérablement les performances de votre requête. Ainsi, dans l'exemple ci-dessus, nous supposons ProductID est le seul champ de recherche, mais ont été à la requête de dire ProductID = 1 ET Catégorie = 7 alors un multiple de la colonne de l'index de l'aide. Ceci est réalisé avec les éléments suivants:
En outre, l'indice devrait correspondre à l'ordre des champs de la requête. Dans mon exemple, l'indice devrait être (ProductID,de la Catégorie) et non pas l'inverse.
the index should match the order of the query fields
?Index de deux types: lorsque vous définissez une clé primaire, MySQL va le prendre comme indice par défaut.
Explication
De clé primaire que l'indice de
Considérer que vous avez un
tbl_student
table et que vous souhaitezstudent_id
comme clé primaire:Déclaration ci-dessus ajoute une clé primaire, ce qui signifie que les valeurs indexées doit être unique et ne peut pas être NULL.
Spécifier le nom de l'index
Déclaration ci-dessus va créer un index avec
student_index
nom.Create unique index
Ici,
student_unique_index
est le nom de l'index attribué à student_id et crée un index pour quelles valeurs doit être unique (ici, nul ne peut être acceptée).Fulltext option
Déclaration ci-dessus va créer l'index de texte intégral au nom de
student_fulltext_index
, pour laquelle vous avez besoin de Mysql MyISAM Moteur.Comment faire pour supprimer les index ?
Comment vérifier les index disponibles?
Vous dites que vous avez un indice, l'expliquer, dit le contraire. Toutefois, si vous avez vraiment, c'est la façon de continuer:
Si vous avez un index sur la colonne, et MySQL décide de ne pas l'utiliser, il peut, par car:
ANALYZE TABLE
aide.Dans le cas de (2) ou (3), vous pourriez coaxial MySQL en utilisant l'index par indicateur d'index 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 que vous allusion elle.