web-dev-qa-db-fra.com

Profil MySQL sur la requête "Création d'un index de tri" en utilisant 75% du temps total

Nous essayons de comprendre comment optimiser une requête (en prenant environ 100 ms) , et le profil en cours d'exécution nous voyons Creating Sort Index en utilisant 75% du temps total. Tout d'abord, quels sont exactement les effets de la création de l'index de tri? Est-ce un disque/io?

Deuxièmement, pouvons-nous optimiser la requête elle-même?

SELECT r.`id`, 
       r.name, 
       r.public_uri, 
       rv.version, 
       rv.interpreter, 
       rv.notes, 
       rv.content, 
       r.added, 
       r.added_by, 
       r.modified, 
       r.modified_by, 
       r.public, 
       r.public_by
  FROM recipe_heads rh, 
       recipes r, 
       recipe_versions rv
 WHERE rh.recipe = r.`id` 
   AND rh.recipe_version = rv.`id` 
   AND r.`id` = rv.recipe
ORDER BY r.added DESC

Explique: Screenshot

10
Justin

Nous avons eu un problème similaire pour les énormes requêtes. Souvent, les requêtes s'exécutaient pendant des heures (jusqu'à 7-8) en fonction de la charge sur la base de données pour 400 millions de lignes. Cependant, notre objectif était d'obtenir des résultats de groupe, tels que sélectionner col1, col2, col3, compter (1), compter (col4 distinct) du groupe du tableau par 1,2,3.

Le problème sous-jacent est le même que le vôtre, car dans les deux cas, DB trie (ordonne) les résultats en interne.

  • Comment fonctionne la création d'un index de tri. Sur le site Web mysql, il est dit "Le thread traite un SELECT qui est résolu en utilisant une table temporaire interne." D'après ma compréhension de l'algorithme, le système est très probablement en train de diviser les données en morceaux, de lire le disque un par un, de trier des morceaux individuels, de les remettre dans un espace disque temporaire, etc. Le système le fait pour tous les morceaux et effectue éventuellement un tri par fusion. Cela implique des lectures/écritures approfondies.

Une solution possible peut être d'augmenter votre mémoire pour DB (afin qu'elle puisse créer de plus gros morceaux qui peuvent rester en mémoire) ou si vous avez une mémoire plus grande ailleurs, vous pouvez programmer la solution en streaming à partir de DB. Ceci peut être réalisé en temps nlogn.

Par programme, je pourrais réduire le temps d'une moyenne de 2 heures à 7,5 minutes cohérentes.

6
Chandni

'Créer un index de tri' est la base de données qui détermine l'ordre de vos valeurs retournées en fonction de votre clause 'order by'. Les principaux limiteurs ici seraient la vitesse CPU/CPU disponible et la bande passante mémoire. Le tri ne sera pas effectué jusqu'à ce que les données soient déjà toutes en mémoire, au moins pour une requête aussi petite. Si vous profilez la requête, voyez-vous des attentes pour des ressources?

Quant à rendre cette requête plus rapide, vous pourriez envisager d'ajouter un index sur 'r.added', car il ne semble pas y en avoir un selon votre explication.

4
Unicorno Marley