Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL nie używa indeksów (Korzystanie z sortowania plików) podczas korzystania z ORDER BY

W tym przypadku nie możesz użyć indeksu, ponieważ używasz RANGE warunek filtrowania.

Jeśli chcesz użyć czegoś takiego jak:

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

, a następnie tworzenie indeksu złożonego na (VALUE1, VALUE2) będzie używany zarówno do filtrowania, jak i do zamawiania.

Ale używasz warunku odległościowego, dlatego i tak musisz wykonać zamówienie.

Twój złożony indeks będzie wyglądał tak:

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

, a jeśli wybierzesz 1 i 2 w value1 , nadal nie otrzymujesz całego posortowanego zestawu value2 .

Jeśli Twój indeks na value2 nie jest bardzo selektywny (tzn. nie ma wielu DISTINCT value2 w tabeli), możesz spróbować:

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

Nazywa się to SKIP SCAN metoda dostępu. MySQL nie obsługuje go bezpośrednio, ale można go emulować w ten sposób.

RANGE w tym przypadku zostanie użyty dostęp, ale prawdopodobnie nie uzyskasz żadnej korzyści w zakresie wydajności, chyba że DISTINCT value2 zawierać mniej niż około 1% rzędów.

Użycie notatek:

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

zamiast

m.value2 = q.value2

To sprawia, że ​​MySQL wykonaj RANGE sprawdzanie każdej pętli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odmowa pozwolenia Laravel na zdalnym serwerze Mysql (AWS aurora)

  2. PHP / MYSQL Dodaj przycisk do kolumny

  3. Błąd zapytania Mysql - Auto Monety DODAJ

  4. Instalowanie MySQL Python na Mac OS X

  5. Jak mogę zsumować kolumny w wielu tabelach w MySQL?