Aangezien je al een index hebt op ip_start
, dit is hoe je het het beste kunt gebruiken, ervan uitgaande dat je één toegang per IP wilt maken (1234
in dit voorbeeld):
select organization from (
select ip_end, organization
from iptable
where ip_start <= 1234
order by ip_start desc
limit 1
) subqry where 1234 <= ip_end
Dit zal uw index gebruiken om een scan te starten die onmiddellijk stopt vanwege de limit 1
. De kosten zouden slechts marginaal hoger moeten zijn dan die van een eenvoudige geïndexeerde toegang. Deze techniek is natuurlijk gebaseerd op het feit dat de bereiken gedefinieerd door ip_start
en ip_end
overlappen elkaar nooit.
Het probleem met uw oorspronkelijke aanpak is dat mysql, die zich niet bewust is van deze beperking, de index alleen kan gebruiken om te bepalen waar de scan moet worden gestart of gestopt die (het denkt) nodig is om alle overeenkomsten voor uw zoekopdracht te vinden.