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;