Givet at du allerede har et indeks på ip_start
, sådan bruger du det bedst, forudsat at du vil have én adgang pr. IP (1234
i dette eksempel):
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
Dette vil bruge dit indeks til at starte en scanning, som stopper øjeblikkeligt på grund af limit 1
. Omkostningerne bør kun være marginalt højere end omkostningerne ved en simpel indekseret adgang. Selvfølgelig er denne teknik afhængig af det faktum, at intervallerne defineret af ip_start
og ip_end
aldrig overlapper hinanden.
Problemet med din oprindelige tilgang er, at mysql, der er uvidende om denne begrænsning, kun kan bruge indekset til at bestemme, hvor den skal starte eller stoppe den scanning, som (den mener) den har brug for for at finde alle matches til din forespørgsel.