Mengingat Anda sudah memiliki indeks di ip_start
, ini adalah cara terbaik untuk menggunakannya, dengan asumsi Anda ingin membuat satu akses per IP (1234
dalam contoh ini):
select organization from (
select ip_end, organization
from iptable
where ip_start <= 1234
order by ip_start desc
limit 1
) subqry where 1234 <= ip_end
Ini akan menggunakan indeks Anda untuk memulai pemindaian yang segera berhenti karena limit 1
. Biayanya seharusnya hanya sedikit lebih tinggi daripada biaya akses terindeks sederhana. Tentu saja, teknik ini bergantung pada fakta bahwa rentang yang ditentukan oleh ip_start
dan ip_end
tidak pernah tumpang tindih.
Masalah dengan pendekatan awal Anda adalah bahwa mysql, karena tidak mengetahui batasan ini, hanya dapat menggunakan indeks untuk menentukan di mana harus memulai atau menghentikan pemindaian yang (menurutnya) diperlukan untuk menemukan semua kecocokan untuk kueri Anda.