Co słyszałeś o skanowaniu zakresów i between w MySQL jest po prostu nieprawdą. Oto cytat z dokumentacji
:
Tak więc użycie indeksu nie jest zaskakujące. Najlepszym indeksem dla tych danych byłby indeks złożony na start, end .
Problem, który masz, polega na tym, że masz dwie kolumny start i end . To sprawia, że zapytanie jest nieco bardziej skomplikowane.
W pewnych okolicznościach poniższe może działać lepiej w pewnych okolicznościach, z indeksem na start i osobny indeks na end i klucz podstawowy w wierszach:
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;