Mysql
 sql >> Database >  >> RDS >> Mysql

Perché MySQL non utilizza un indice per un confronto maggiore di?

Probabilmente faresti meglio a lasciare che MySql decida sul piano di query. C'è una buona possibilità che eseguire una scansione dell'indice sia meno efficiente di una scansione completa della tabella.

Ci sono due strutture di dati su disco per questa tabella

  1. Il tavolo stesso; e
  2. L'indice B-Tree della chiave primaria.

Quando esegui una query, l'ottimizzatore ha due opzioni su come accedere ai dati:

SELECT * FROM userapplication WHERE application_id > 1025;

Utilizzo dell'indice

  1. Scansiona l'indice B-Tree per trovare l'indirizzo di tutte le righe in cui application_id > 1025
  2. Leggi le pagine appropriate della tabella per ottenere i dati per queste righe.

Non si utilizza l'indice

Scansiona l'intera tabella e scegli i record appropriati.

Scegliere la migliore strategia

Il compito di Query Optimizer è scegliere la strategia più efficiente per ottenere i dati desiderati. Se sono presenti molte righe con un application_id > 1025 quindi può effettivamente essere meno efficiente utilizzare l'indice. Ad esempio se il 90% dei record ha un application_id > 1025 quindi il Query Optimizer dovrebbe scansionare circa il 90% dei nodi foglia dell'indice b-tree e quindi leggere anche almeno il 90% della tabella per ottenere i dati effettivi; ciò comporterebbe la lettura di più dati dal disco rispetto alla semplice scansione della tabella.