Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Pesquisa eficiente em uma tabela de intervalo


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.