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
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.
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.
'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.