J'utilise actuellement la requête suivante pour jsPerf. Dans le cas probable vous ne connaissez pas jsPerf - il y a deux tables: pages
contenant les cas de test/révisions, et tests
contenant les extraits de code pour les tests dans les cas de test. Il existe actuellement 937 enregistrements dans pages
et 3817 enregistrements dans tests
.Comment optimiser cette requête MySQL à faible performance?
Comme vous pouvez le voir, il faut un certain temps pour charger the “Browse jsPerf” page où cette requête est utilisée.
La requête prend environ 7 secondes pour exécuter:
SELECT
id AS pID,
slug AS url,
revision,
title,
published,
updated,
(
SELECT COUNT(*)
FROM pages
WHERE slug = url
AND visible = "y"
) AS revisionCount,
(
SELECT COUNT(*)
FROM tests
WHERE pageID = pID
) AS testCount
FROM pages
WHERE updated IN (
SELECT MAX(updated)
FROM pages
WHERE visible = "y"
GROUP BY slug
)
AND visible = "y"
ORDER BY updated DESC
J'ai ajouté des index sur tous les champs qui apparaissent dans WHERE
clauses. Devrais-je en ajouter d'autres?
Comment cette requête peut-elle être optimisée?
P.S. Je sais que je pourrais implémenter un système de cache en PHP - je le ferai probablement, alors s'il vous plait, ne me le dites pas :) J'aimerais vraiment savoir comment cette requête pourrait aussi être améliorée.
Avez-vous ajouté un index pour chaque colonne, ou avez-vous ajouter des indices qui combinent des colonnes en fonction de la façon dont ils sont utilisés? Par exemple, je pense qu'un index sur slug AND visible pourrait mieux que deux indices distincts. En fait, vous pourriez avoir besoin de l'index combiné et un autre juste visible. – FrustratedWithFormsDesigner
Assurez-vous que vous avez des index sur les colonnes appropriées. Publiez la sortie d'EXPLAIN sur votre requête. – nos
@FrustratedWithFormsDesigner: Voici les index que j'ai actuellement: Index pour la table 'pages': http://i.imgur.com/msQtn.png Index pour la table' tests': http://i.imgur.com/Zwtb7 .png Notez l'index combiné sur 'slug' et' revision' - devrais-je changer cela en 'slug' et' visible'? –