Requête lente sur information_schema.tables
- Je exécuter un ensemble d'applications développées sur un hébergement mutualisé offre de service. J'ai déménagé de statique configurée liste de tables de tables de, à un système basé sur une liste de tables de bases sur un préfixe de la D/B métadonnées. Quand j'ai fait la promotion de cette version de la fonction publique, mon par demande de latence a augmenté en moyenne de 2.3–2.4 secondes. Certains instrumentation a révélé que c'était entièrement à l'une requête SQL:
SELECT TABLE_NAME AS name
FROM information_schema.tables
WHERE TABLE_SCHEMA = '<DBname>'
AND TABLE_NAME LIKE '<TablePrefix>%';
J'ai utilisé ce parce que je voulais explicitement le nom de la colonne dans le jeu de résultats. Cependant, le codage autour de cela avec une autre requête qui ajoute une ligne de code qui a couru dans <2 mSec:
SHOW TABLES LIKE '<TablePrefix>%';
Mon fournisseur de services utilise MySql Enterprise 5.0.92-50 donc je ne peux pas le faire tout de profilage. C'est une mise à l'échelle problème ne se produit pas sur mon environnement de dev et test VM où je peux le profil. Ils prendre en charge des milliers d'utilisateurs de sorte que le live schéma sera très grand, mais tout de même connexion et la plupart des requêtes ne prendre que quelques millisecondes.
Personne ne sait pourquoi l'interrogation de la mémoire à base information_schema sur un grand système multi-utilisateur serait-il si long?
OriginalL'auteur TerryE | 2012-07-02
Vous devez vous connecter pour publier un commentaire.
Les informations de schéma n'est pas optimisé, il n'y a pas d'index, juste des tables avec des métadonnées, et habituellement, lorsque vous SÉLECTIONNEZ exécuter à partir du schéma, il s'ouvre et lit les fichiers.
Ont un coup d'oeil à cet article - L'optimisation de Requêtes INFORMATION_SCHEMA; dans certains cas, il pourra vous aider.
J'ai fait un strace de la mysqld pour la SHOW TABLES et ce n'est qu'un openat() de la DB dir, obtenir le dir entrées et ouvre chaque fichier FRM des tables correspondant au modèle, mais ils sont tous dans le VFAT cache sur mon système, donc cela ne prend que quelques millisecondes. L'instruction SELECT est cas plus vite que cela fait la même openat()+getents(), mais ne permet pas d'ouvrir les fichiers FRM. Donc je suppose que c'est une particularité de mon fournisseur d'hébergement encore de l'utilisation de MySQL 5.0
Votre sna poussé mon dans la bonne direction et m'a aidé à répondre à la Q moi-même. Ses dommage que je l'ai mis à la corbeille de mon ancien Ubuntu 8.04 VM donc je n'ai pas une pile LAMP fonctionnement de MySQL 5.0 que je peux strace, mais je suis heureux que le unoptimized aspect de la I_S requêtes et un balayage complet est le problème à la racine.
OriginalL'auteur Devart
Pour ceux qui veulent un hack avec un inconvénient mineur: http://www.mysqlperformanceblog.com/2011/12/23/solving-information_schema-slowness/
Ce qu'il fait est-il désactiver certains des stats qui jour si vous interrogez le schéma, plus d'informations ici: http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata
Et pour rendre les choses plus facile pour les paresseux vauriens qui ne veulent pas lire, vous avez seulement besoin de faire un changement d'un paramètre:
Vous pouvez le faire dans le fichier de configuration ou de manière dynamique:
Remarque le innodb_stats_on_metadata paramètre n'est pas disponible en MySQL 5.0
OriginalL'auteur Populus