problème de performance de table MySQL MyISAM revisitée
-
21-08-2019 - |
Question
Cette question est liée à celui-ci .
J'ai un table avec la structure suivante:
CREATE TABLE mydatabase.page (
pageid int(10) unsigned NOT NULL auto_increment,
sourceid int(10) unsigned default NULL,
number int(10) unsigned default NULL,
data mediumtext,
processed int(10) unsigned default NULL,
PRIMARY KEY (pageid),
KEY sourceid (sourceid)
) ENGINE=MyISAM AUTO_INCREMENT=9768 DEFAULT CHARSET=latin1;
données colonne contient du texte dont la taille est de 80 Ko - 200 Ko par enregistrement. La taille totale des données stockées dans les données colonne est d'environ 1,5 Go.
L'exécution de cette requête prend 0,08 secondes:
select pageid from page
Mais l'exécution de cette requête prend autour de 130,0 secondes:
select sourceid from page
Comme vous le voyez, j'ai un index primaire sur page.pageid et un index sur page.sourceid. Donc, si la deuxième requête prendra que longue?
Edit # 1
EXPLIQUEZ retourné
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE page index sourceid 5 9767 Using index
Je suis désolé, mais le profilage ne fonctionne pas ... MySQL (la 4.1.22) ne reconnaissait pas la requête SHOW PROFIL.
SHOW INDEX retour
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
page 0 PRIMARY 1 pageid A 9767 BTREE
page 1 sourceid 1 sourceid A 3255 YES BTREE
La solution
Avez-vous essayé d'imposer l'utilisation de l'indice? Comme:
SELECT sourceid FROM page USE INDEX (sourceid_index)
Comme commentaires sgehrig, vérifiez avec EXPLAIN si l'indice est utilisé? Et partager le résultat?
EXPLAIN select sourceid from page
Il pourrait également aider à partager les definiton des indices:
SHOW INDEX FROM page
Autres conseils
Quelle différence sont vos champs SourceID? Si vous avez seulement quelques valeurs différentes SourceID par rapport au nombre de lignes, vous pouvez essayer d'augmenter la taille de l'index.
MySQL 4.1.22 est assez vieux (02 Novembre 2006) Je pense qu'il ne supporte pas la notion de pour les clés secondaires couvrant les index . Montre que la EXPLAIN
requête utilise effectivement l'index, donc je suppose que le délai supplémentaire est nécessaire pour lire toutes les lignes de résultat (au lieu de simplement retourner le contenu de l'index lorsque vous utilisez couvrant les index ) à extraire la colonne sourceid
.
Avez-vous la possibilité de vérifier la requête sur une version du serveur MySQL plus récent?