Saya menemukan solusi yang bergantung pada properti data dalam tabel. Saya lebih suka memiliki solusi yang lebih umum yang tidak bergantung pada data saat ini, tetapi untuk saat ini itulah yang terbaik yang saya miliki.
Masalah dengan kueri asli:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
adalah bahwa eksekusi mungkin memerlukan pemindaian sebagian besar entri di FirstX
,LastX
,P
indeks ketika kondisi pertama FirstX <= ?
dipenuhi oleh sebagian besar baris.
Apa yang saya lakukan untuk mengurangi waktu eksekusi adalah mengamati bahwa LastX-FirstX
relatif kecil.
Saya menjalankan kueri:
SELECT MAX(LastX-FirstX) FROM SomeTable;
dan dapatkan 4200000
.
Artinya FirstX >= LastX – 4200000
untuk semua baris dalam tabel.
Jadi untuk memenuhi LastX >= ?
, kita juga harus memenuhi FirstX >= ? – 4200000
.
Jadi kita bisa menambahkan kondisi ke query sebagai berikut:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
Dalam contoh yang saya uji dalam pertanyaan, jumlah entri indeks yang diproses berkurang dari 2104820
ke 18
dan waktu berjalan berkurang dari 0,563 detik hingga 0,0003 detik .
Saya menguji kueri baru dengan 120000
yang sama nilai X
. Outputnya identik dengan kueri lama. Waktu turun dari lebih dari 10 jam hingga 5,5 menit , yang lebih dari 100 kali lebih cepat .