Dado que você já tem um índice em
ip_start
, esta é a melhor forma de usá-lo, supondo que você queira fazer um acesso por IP (1234
neste exemplo):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
Isso usará seu índice para iniciar uma varredura que será interrompida imediatamente devido ao
limit 1
. O custo deve ser apenas marginalmente superior ao de um simples acesso indexado. Claro, esta técnica depende do fato de que os intervalos definidos por ip_start
e ip_end
nunca se sobreponha. O problema com sua abordagem original é que o mysql, desconhecendo essa restrição, só pode usar o índice para determinar onde iniciar ou parar a varredura que (ele pensa) precisa para encontrar todas as correspondências para sua consulta.