Vzhledem k tomu, že již máte index na ip_start
, to je způsob, jak jej používat nejlépe, za předpokladu, že chcete provést jeden přístup na IP (1234
v tomto příkladu):
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
To použije váš index ke spuštění skenování, které se okamžitě zastaví kvůli limit 1
. Náklady by měly být jen nepatrně vyšší než náklady na jednoduchý indexovaný přístup. Tato technika samozřejmě spoléhá na skutečnost, že rozsahy jsou definovány ip_start
a ip_end
nikdy se nepřekrývají.
Problém s vaším původním přístupem je v tom, že mysql, který si tohoto omezení není vědom, může použít index pouze k určení, kde začít nebo zastavit skenování, které (si myslí), že potřebuje k nalezení všech shod pro váš dotaz.