Ordre par colonne devrait avoir index ou pas?

35

J'ai ajouté à la table des index utilisés pour la recherche du résultat. Je montre les résultats par ordre ASC ou DESC. Donc, cette colonne devrait avoir un index ou pas? J'ai 2 autres index sur cette table. Quelle incidence les performances auront-elles sur l'indexation de cette colonne?

Somnath Muluk
la source
2
S'il vous plaît poster la requête
RolandoMySQLDBA

Réponses:

26

Oui, MySQL peut utiliser un index sur les colonnes de ORDER BY (sous certaines conditions). Cependant, MySQL ne peut pas utiliser d’index pour un ASC mixte , DESC order by by ( SELECT * FROM foo ORDER BY bar ASC, pants DESC). Partager votre requête et votre instruction CREATE TABLE nous aiderait à répondre plus précisément à votre question.

Pour des conseils sur la façon d'optimiser les clauses ORDER BY: http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

Modifier 21/01/2012 à 8h53

Il y avait des questions sur la source de ma déclaration sur l'utilisation d'un index avec une combinaison ASC / DESC dans ORDER BY. Dans la documentation d' optimisation ORDER BY :

Dans certains cas, MySQL ne peut pas utiliser d'index pour résoudre ORDER BY, même s'il utilise toujours des index pour rechercher les lignes correspondant à la clause WHERE. Ces cas incluent les suivants:

...

Vous mélangez ASC et DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

...

De plus, le mot clé DESC n'a pas de sens dans CREATE INDEX

Une spécification index_col_name peut se terminer par ASC ou DESC. Ces mots-clés sont autorisés pour les extensions futures afin de spécifier un stockage de valeur d'index croissant ou décroissant. Actuellement, ils sont analysés mais ignorés. les valeurs d'index sont toujours stockées dans l'ordre croissant.

Aaron Brown
la source
3
"MySQL ne peut pas utiliser un index pour un ASC mixte, DESC" . Référence pour cela?
Ypercubeᵀᴹ
CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);devrait marcher.
Frank Heikens
Mon source est la documentation mysql liée dans ma réponse. Recherchez "mix".
Aaron Brown
3
MySQL analyse asc & Desc dans CREATE INDEX, mais les ignore. Les index sont toujours stockés dans l'ordre croissant. dev.mysql.com/doc/refman/5.5/fr/create-index.html
Aaron Brown
1
Nouveau avec MySQL 8.0 : Il peut maintenant utiliser un mélange de ASCet DESC si l' INDEXa le même mélange.
Rick James le
4

Pour ceux qui s’interrogent sur la réponse à PostgreSQL, la réponse est oui, un index sera utilisé. Selon la documentation de PostgreSQL, le planificateur de requêtes "envisagera de satisfaire à une spécification ORDER BY soit en analysant un index disponible correspondant à la spécification, soit en analysant la table dans un ordre physique et en effectuant un tri explicite". Cela signifie que s’il existe un index que le planificateur peut utiliser, il le fera en revenant à faire un tri après avoir récupéré les lignes correspondantes.

douglasr
la source