Co jste slyšeli o skenování rozsahu a between v MySQL to prostě není pravda. Zde je citát z dokumentace
:
Použití indexu tedy není překvapivé. Nejlepší index pro tato data by byl složený index na start, end .
Problém, který máte, je, že máte dva sloupce start a end . Tím je dotaz o něco složitější.
Následující by za určitých okolností mohly fungovat lépe, s indexem na start a samostatný index na end a primární klíč na řádcích:
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;