Какво сте чували за сканиране на обхват и between в MySQL просто не е вярно. Ето цитат от документацията
:
Така че използването на индекс не е изненадващо. Най-добрият индекс за тези данни би бил съставен индекс на start, end .
Проблемът, който имате, е, че имате две колони start и end . Това прави заявката малко по-сложна.
Следното би могло да се представи по-добре при някои обстоятелства, с индекс на start и отделен индекс в end и първичен ключ в редовете:
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;