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

MySQL bruger ikke indekser (Using filesort) ved brug af ORDER BY

Du kan ikke bruge et indeks i dette tilfælde, da du bruger en RANGE filtreringstilstand.

Hvis du vil bruge noget som:

SELECT  *
FROM    values_table this_
WHERE   this_.value1 = @value
ORDER BY
        value2
LIMIT 10

, og opret derefter et sammensat indeks på (VALUE1, VALUE2) ville blive brugt både til filtrering og til bestilling.

Men du bruger en rækkeviddetilstand, og det er derfor, du bliver nødt til at udføre bestilling alligevel.

Dit sammensatte indeks vil se sådan ud:

value1 value2
-----  ------
1      10
1      20
1      30
1      40
1      50
1      60
2      10
2      20
2      30
3      10
3      20
3      30
3      40

, og hvis du vælger 1 og 2 i value1 , får du stadig ikke et helt sorteret sæt af value2 .

Hvis dit indeks på value2 er ikke særlig selektiv (dvs. der er ikke mange DISTINCT value2). i tabellen), kan du prøve:

CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)

/* Note the order, it's important */    

SELECT  *
FROM    (
        SELECT  DISTINCT value2
        FROM    mytable
        ORDER BY
                value2
        ) q,
        mytable m
WHERE   m.value2 >= q.value2
        AND m.value2 <= q.value2
        AND m.value1 BETWEEN 13123123 AND 123123123

Dette kaldes en SKIP SCAN adgangsmetode. MySQL understøtter det ikke direkte, men det kan emuleres på denne måde.

RANGE adgang vil blive brugt i dette tilfælde, men sandsynligvis vil du ikke få nogen ydeevnefordel, medmindre DISTINCT value2 omfatter mindre end ca. 1% rækker.

Bemærk brugen af:

m.value2 >= q.value2
AND m.value2 <= q.value2

i stedet for

m.value2 = q.value2

Dette gør MySQL udfør RANGE kontrol af hver sløjfe.



  1. MySQL Workbench få adgang til administration?

  2. Hvad er den bedste søgealgoritme til PHP og MYSQL?

  3. Sådan bruges GOTO i SQL Server

  4. PostgreSQL - indstil en standardcelleværdi i henhold til en anden celleværdi