Biorąc pod uwagę, że masz już indeks na ip_start
, w ten sposób najlepiej z niego korzystać, zakładając, że chcesz uzyskać jeden dostęp na adres IP (1234
w tym przykładzie):
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
Spowoduje to użycie indeksu do rozpoczęcia skanowania, które zatrzymuje się natychmiast z powodu limit 1
. Koszt powinien być tylko nieznacznie wyższy niż koszt prostego dostępu indeksowanego. Oczywiście ta technika opiera się na fakcie, że zakresy zdefiniowane przez ip_start
i ip_end
nigdy się nie nakładają.
Problem z twoim pierwotnym podejściem polega na tym, że mysql, nie wiedząc o tym ograniczeniu, może użyć indeksu tylko do określenia, gdzie rozpocząć lub zatrzymać skanowanie, którego (myśli) potrzebuje, aby znaleźć wszystkie dopasowania dla twojego zapytania.