sql >> Base de Datos >  >> RDS >> Mysql

Búsqueda eficiente en una tabla de rango

Dado que ya tiene un índice en ip_start , así es como se usa mejor, asumiendo que quieres hacer un acceso por IP (1234 en este ejemplo):

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

Esto usará su índice para iniciar un escaneo que se detiene inmediatamente debido al limit 1 . El costo solo debería ser marginalmente más alto que el de un simple acceso indexado. Por supuesto, esta técnica se basa en el hecho de que los rangos definidos por ip_start y ip_end nunca se superponga.

El problema con su enfoque original es que mysql, al desconocer esta restricción, solo puede usar el índice para determinar dónde comenzar o detener el análisis que (cree) necesita para encontrar todas las coincidencias para su consulta.