Actuellement, le tableau présente les indices suivants:Aide Optimisation d'un SELECT MySQL avec ORDER BY
- forum_id_index
- other_forum_id_index
- forum_id_on_other_forum_id_index => [forum_id, other_forum_id]
La requête:
SELECT `topics.*`
FROM `topics`
WHERE (table.forum_id = ? OR table.other_forum_id = ?)
ORDER by sticky, replied_at DESC LIMIT 25
J'ai essayé d'ajouter des indices sur les points suivants:
- collant
- replied_at
- [collant, replied_at]
- [forum_id, other_forum_id, collant, replied_at]
- [collant, replied_at , forum_id, other_forum_id]
Ceci est pour un forum, en essayant d'obtenir le top 25 des sujets dans le forum, mais en plaçant sticky
sujets (collant est un champ binaire pour collant/non-collant) en haut.
J'ai lu à peu près tout ce que je peux obtenir sur l'optimisation ORDER BY
, mais pas de chance. C'est sur MySQL 5.1, INNODB
. Toute aide serait grandement appréciée.
Permet de modifier
Comme demandé dans les commentaires (désolé si je le fais mal - nouveau pour l'affichage sur SU). Résultats de EXPLIQUER actuellement:
id = 1
select_type = SIMPLE
table = sujets
type = index_merge
possible_keys = index_topics_on_forum_id, index_topics_on_sticky_and_replied_at, index_topics_on_forum_id_and_replied_at, index_topics_on_video_forum_id, index_forum_id_on_video_forum_id ,
clés = index_topics_on_forum_id, index_topics_on_video_forum_id
key_len = 5,5
ref = NULL
lignes = 13584
supplémentaire = Utiliser l'union (index_topics_on_forum_id, index_topics_on_video_forum_id); En utilisant où; Utilisation de filesort
AFFICHER INDEX ES DE sujets retourne https://gist.github.com/1079454 - Impossible d'obtenir la mise en forme pour apparaître ici bien.
EDIT 2
SELECT `topics`.*
FROM `topics`
WHERE topics.forum_id=4
ORDER BY sticky desc, replied_at DESC
Runs incroyablement rapide (1,4 ms). Il en va de même pour la requête lorsque je change topic.forum_id en topics.video_forum_id - mais pas quand je les ai tous les deux dans la requête avec un ou.
Pouvez-vous montrer la sortie pour: SHOW indexes topics'? Pouvez-vous afficher la sortie pour: 'EXPLAIN SELECT ....'? (Il suffit donc de placer le mot 'EXPLAIN' devant votre requête – Eljakim
@entity Combien de lignes retourne-t-il sans LIMIT 25? – Karolis