Med tanke på att du redan har ett index på ip_start
, så här använder du det bäst, förutsatt att du vill göra en åtkomst per IP (1234
i det här exemplet):
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
Detta kommer att använda ditt index för att starta en skanning som slutar omedelbart på grund av limit 1
. Kostnaden bör endast vara marginellt högre än den för en enkel indexerad access. Naturligtvis förlitar sig denna teknik på det faktum att de intervall som definieras av ip_start
och ip_end
aldrig överlappa.
Problemet med ditt ursprungliga tillvägagångssätt är att mysql, som inte är medveten om denna begränsning, bara kan använda indexet för att avgöra var den ska börja eller stoppa skanningen som (den tror) den behöver för att hitta alla matchningar för din fråga.