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.