2012-04-13 2 views
0

Je me demande simplement s'il y a quelque chose que je pourrais faire pour que la requête soit plus rapide?Comment faire pour que cette requête s'exécute plus vite?

J'ai cette requête:

SELECT * FROM posts 
WHERE posts.exists = 'n' 
ORDER BY posts.ratecount DESC 
LIMIT 0,100 

Prend: 2.47s @ 0100 | 6.18s @ 500,100

Cela fonctionne mais il tend à devenir plutôt lent à mesure que la limite augmente (100,100> 200,100 etc.).

L'utilisation d'un index ne semble pas aider soit:

SELECT * FROM posts 
USE INDEX(ratecount_ca) 
WHERE posts.exists = 'n' 
ORDER BY posts.ratecount DESC 
LIMIT 0,100 

Prend: 8.59s @ 0100 | 28,98s @ 500,100

Assez étrangement, sans le où il fonctionne parfaitement.

Un index descendant serait très probablement résoudre le problème, mais comme cela ne semble pas encore être implémenté, j'ai besoin d'une autre option. Faire WHERE après sa commande accélérerait la plupart du temps sans doute vers le haut aussi, mais depuis que je suis assez nouveau à SQL je ne sais pas comment faire: <

Répondre

1

Quelle version de MySQL utilisez-vous? Les documents v5.0 suggèrent qu'il existe un moyen de modifier l'ordre des index.

Je suggère de créer un index sur les deux colonnes. Il devrait ressembler à quelque chose comme:

CREATE INDEX index_2_cols ON posts(exists, ratecount DESC); 
+0

Cela a fonctionné parfaitement. Merci! : D –

+0

Pouvez-vous poster combien de performance améliorée? Juste pour ma curiosité :) –

+1

Est parti de 8.59s> 0.93s. Assez sûr qu'il pourrait aller plus bas, mais cela fonctionne pour ce que j'en ai besoin. : 0 Assez sûr que c'est parce que vous ne pouvez pas encore modifier l'ordre de l'index même si l'option est là: "Une spécification index_col_name peut se terminer par ASC ou DESC Ces mots-clés sont autorisés pour de futures extensions pour spécifier une valeur d'index ascendant ou descendant Actuellement, ils sont analysés mais ignorés, les valeurs d'index sont toujours stockées dans l'ordre croissant. –

0

Puisque vous avez dit que l'omission de la condition where fait courir vite, Je voudrais essayer de create an index sur exists champ de la table posts:

CREATE INDEX ON posts_exists ON posts (exists(10)); 
+0

Cela ne semble pas fonctionner, il était toujours à peu près la même vitesse que la deuxième requête. –

Questions connexes