Supposons, à titre d'exemple, vous exécutez une bibliothèque à l'aide d'un simple MySQL "livres" tableau avec trois colonnes:
(id, titre, statut)
- id est la clé primaire
- le titre est le titre du livre
- le statut pourrait être un enum décrivant le livre de l'état actuel (par exemple: DISPONIBLE, CHECKEDOUT, de TRAITEMENT, de MANQUE)
Une requête simple pour combien de livres tombent dans chaque etat est la suivante:
SELECT status, COUNT(*) FROM books GROUP BY status
ou pour trouver combien de livres sont disponibles:
SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"
Cependant, une fois que la table atteint plusieurs millions de lignes, ces requêtes prendre plusieurs secondes. L'ajout d'un index de la colonne "statut" ne semble pas faire une différence dans mon expérience.
Outre périodiquement la mise en cache des résultats ou explicitement mise à jour des informations de résumé dans un tableau distinct à chaque fois qu'un livre change d'état (via des déclencheurs ou un autre mécanisme), existe-il des techniques pour accélérer à ces types de requêtes? Il semble que le nombre de requêtes a l'air à chaque ligne, et (sans connaître plus de détails) je suis un peu surpris que cette information ne peut en quelque sorte être déterminée à partir de l'index.
Mise à JOUR
En utilisant l'exemple de la table (avec un indexée colonne "statut") avec 2 millions de lignes, je comparés au GROUPE PAR la requête. En utilisant le moteur de stockage InnoDB, la requête prend 3.0 - 3.2 secondes sur ma machine. À l'aide de MyISAM, la requête prend 0.9 - 1.1 secondes. Il n'y avait pas de différence significative entre count(*), count(statut), ou de comptage(1) dans les deux cas.
MyISAM est certes un peu plus vite, mais j'étais curieux de voir si il y avait moyen de faire un équivalent de l'exécution de la requête beaucoup plus rapide (par exemple de 10 à 50 ms -- assez rapide pour être appelé sur chaque page de site demande pour un faible trafic de site) sans le mental généraux de la mise en cache et les déclencheurs. Il semble que la réponse est "il n'y a pas moyen d'exécuter la requête directe rapidement", qui est ce que j'attendais - je voulais juste m'assurer que je n'étais pas en manque d'une alternative simple.