Quello che hai sentito sulle scansioni dell'intervallo e su between in MySQL semplicemente non è vero. Ecco una citazione dalla documentazione
:
Quindi, l'uso di un indice non è sorprendente. L'indice migliore per questi dati sarebbe un indice composito su start, end .
Il problema che hai è che hai due colonne start e end . Questo rende la query un po' più complicata.
Quanto segue potrebbe plausibilmente funzionare meglio in alcune circostanze, con un indice su start e un indice separato su end e una chiave primaria sulle righe:
select gt.*
from (SELECT * FROM autumn4.ip WHERE :number >= start) gt join
(SELECT * FROM autumn4.ip WHERE :number <= end) lt
on gt.PRIMARYKEY = lt.PRIMARYKEY;