Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL tidak menggunakan indeks (Menggunakan filesort) saat menggunakan ORDER BY

Anda tidak dapat menggunakan indeks dalam kasus ini, karena Anda menggunakan RANGE kondisi penyaringan.

Jika Anda menggunakan sesuatu seperti:

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

, lalu buat indeks gabungan pada (VALUE1, VALUE2) akan digunakan untuk menyaring dan memesan.

Tapi Anda menggunakan kondisi jarak jauh, itu sebabnya Anda tetap harus melakukan pemesanan.

Indeks komposit Anda akan terlihat seperti ini:

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

, dan jika Anda memilih 1 dan 2 di value1 , Anda masih belum mendapatkan seluruh rangkaian value2 . yang diurutkan .

Jika indeks Anda pada value2 tidak terlalu selektif (yaitu tidak banyak DISTINCT value2 dalam tabel), Anda dapat mencoba:

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

Ini disebut SKIP SCAN metode akses. MySQL tidak mendukungnya secara langsung, tetapi dapat ditiru seperti ini.

RANGE akses akan digunakan dalam kasus ini, tetapi mungkin Anda tidak akan mendapatkan manfaat kinerja apa pun kecuali DISTINCT value2 terdiri kurang dari sekitar 1% baris.

Catatan penggunaan:

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

bukannya

m.value2 = q.value2

Ini membuat MySQL lakukan RANGE memeriksa setiap loop.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengelompokkan record dari while loop | PHP

  2. beberapa kueri mySQL - mengembalikan kesalahan mysql_fetch_array

  3. Menggunakan hasil SQL dalam loop foreach

  4. MySQL JOIN baris terbaru saja?

  5. Mengambil baris, dengan data dari tabel pasangan nilai kunci di MySQL