2016-11-18 1 views
2

Je cours une requête select très simple sur certaines tables de information_schema mais cela prend toujours trop de temps.pourquoi la requête sur infomation_schema prend du temps?

Par exemple:

select * from limite referential_constraints 3;

Il faut environ 34 secondes.

Cette requête est très simple, pas besoin d'analyse de table, je pense, pas besoin de toute condition, etc. Donc, pourquoi cela prend trop de temps.

certaines autres tables dans information_Schema prennent également beaucoup de temps.

Merci

Répondre

1

Les tables INFORMATION_SCHEMA ne sont pas vraiment des tables. Ils sont un mécanisme qui expose les internes du serveur via l'interface SQL. Les réponses à ces requêtes ne proviennent pas de données "stockées dans une table" dans un sens quelconque - elles sont "collectées" chaque fois que la requête est exécutée.

Le niveau de communication entre la couche SQL et les couches inférieures qui collectent les données ne prend pas toujours en charge les optimisations auxquelles vous pouvez vous attendre; par exemple, le LIMIT n'est probablement pas tombé en panne - la table entière est rendue en interne et toutes les lignes sauf les trois premières sont supprimées ... donc cette requête est probablement aussi lente avec et sans limite. Deux règles générales avec information_schema - qui sont vraiment valables pour tout le SQL, mais particulièrement ici, sont de sélectionner uniquement les colonnes dont vous avez besoin (pas *, ce qui nécessitera potentiellement que le serveur fasse plus de travail que nécessaire si vous n'avez pas vraiment besoin de toutes les colonnes retournées) et spécifiez WHERE, les deux peuvent réduire la quantité de travail interne en cours.

Un autre tueur de performance potentiel est l'optimisation lourde ("tuning") des variables de serveur. La plupart des variables sur la plupart des systèmes doivent être laissés souvent seuls. Certains d'entre eux, comme table_open_cache peuvent même causer des problèmes de fonctionnement du serveur, le plus "optimalement" vous les accordez.

+0

comment table_open_cache donne un avantage dans cette requête? Pouvez-vous s'il vous plaît expliquer? Cette requête ouvre-t-elle toutes les tables à analyser? –