Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL utilise un index différent en fonction de la valeur limite avec la requête ORDER BY

C'est ainsi que les choses se passent. Patientez avec moi une minute...

L'optimiseur souhaite utiliser un INDEX, dans ce cas ACTI_DATE_I. Mais il ne veut pas l'utiliser si cela serait plus lent.

Plan A :Utilisez l'index.

  1. Atteindre l'index structuré en arbre à la fin (à cause de DESC)
  2. Balayer vers l'arrière
  3. Pour chaque ligne de l'index, recherchez la ligne correspondante dans les données. Remarque :L'index a (ACTIVITY_DATE, ACTIVITY_ID) car la PRIMARY KEY est implicitement ajoutée à toute clé secondaire. Accéder aux "données" en utilisant le PK (ACTIVITY_ID) est une autre recherche BTree, potentiellement aléatoire. Il est donc potentiellement lent. (Mais pas très lent dans votre cas.)
  4. Cela s'arrête après LIMIT lignes.

Plan B :Ignorer le tableau

  1. Scannez la table, construisant une table tmp. (Probablement en mémoire.)
  2. Trier la table tmp
  3. Décollez LIMIT lignes.

Dans votre cas (96 -- 1% de 10K), il est surprenant qu'il ait choisi le scan de table. Normalement, le seuil se situe entre 10 % et 30 % du nombre de lignes du tableau.

ANALYZE TABLE devrait ont provoqué un recalcul des statistiques, ce qui pourrait l'ont convaincu d'aller avec l'autre Plan.

Quelle version de MySQL utilisez-vous ? (Non, je ne suis au courant d'aucun changement dans ce domaine.)

Une chose que vous pourriez essayer :OPTIMIZE TABLE ACTIVITIES; Cela reconstruira la table, remballant ainsi les blocs et conduisant à potentiellement différentes statistiques. Si cela aide, j'aimerais le savoir - puisque je dis normalement "Optimiser la table est inutile".