Dato che hai già un indice su ip_start
, ecco come usarlo al meglio, supponendo che tu voglia effettuare un accesso per IP (1234
in questo esempio):
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
Questo utilizzerà il tuo indice per avviare una scansione che si interrompe immediatamente a causa del limit 1
. Il costo dovrebbe essere solo marginalmente superiore a quello di un semplice accesso indicizzato. Naturalmente, questa tecnica si basa sul fatto che gli intervalli definiti da ip_start
e ip_end
mai sovrapporre.
Il problema con il tuo approccio originale è che mysql, non essendo a conoscenza di questo vincolo, può utilizzare l'indice solo per determinare dove avviare o interrompere la scansione di cui (pensa) ha bisogno per trovare tutte le corrispondenze per la tua query.