2011-09-23 2 views
1

Si je comprends bien, un index sur une table de base de données typique fournira une recherche de ligne plus efficace. Est-ce qu'une structure similaire existe pour rendre les requêtes avec des fonctions agrégées plus efficaces?MySQL - Index pour accélérer les requêtes avec des fonctions d'agrégat

À titre d'exemple, disons que j'ai une table comme ci-dessous avec un grand nombre de lignes

Employees 
employeeId | office | salary 

SELECT office, MAX(salary) 
FROM Employees 
GROUP BY office 

Je veux récupérer efficacement le salaire MAX() pour les employés de chaque bureau. Dans ce cas, cela ne me dérange pas la surcharge supplémentaire d'insertion/mise à jour parce que je vais faire cette requête assez souvent et ne pas écrire à la table très souvent.

Mon moteur est MyISAM MySQL

+0

Je ne vois aucun moyen de contourner ceci en dehors du suivi manuel du max ailleurs. – NullUserException

+0

J'imagine que l'ajout d'un index sur 'salary' accélérerait la fonction d'agrégat' MAX (salary) '. N'est-ce pas? –

+0

@rfausak: non, seul champ 'salaire' index ne aidera pas du tout – zerkms

Répondre

1

indice composite office + salary est le meilleur que vous pouvez faire (si vous ne voulez pas simplement stocker le maximum précalculée dans une autre table).

2

Utilisez EXPLAIN pour voir le plan d'exécution de la requête. Puis ajoutez un index et vérifiez si le plan d'exécution de la requête s'améliore.

Vous pouvez également utiliser le profilage:

mysql> SET profiling=ON; 
mysql> SELECT… 
mysql> SET profiling=OFF; 
mysql> SHOW PROFILES; 
mysql> SHOW PROFILE FOR QUERY 1; 

Cloisonnement pourrait également améliorer les performances de votre requête.

Questions connexes