Като се има предвид, че вече имате индекс на ip_start
, това е как да го използвате най-добре, ако приемем, че искате да направите един достъп на IP (1234
в този пример):
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
Това ще използва вашия индекс, за да започне сканиране, което спира незабавно поради limit 1
. Цената трябва да бъде само малко по-висока от тази на обикновен индексиран достъп. Разбира се, тази техника разчита на факта, че диапазоните, дефинирани от ip_start
и ip_end
никога не се припокриват.
Проблемът с вашия първоначален подход е, че mysql, тъй като не знае за това ограничение, може да използва само индекса, за да определи къде да започне или спре сканирането, което (той смята), че му е необходимо, за да намери всички съвпадения за вашата заявка.