Mysql
 sql >> Base de données >  >> RDS >> Mysql

Recherche efficace dans une table de plage

Étant donné que vous avez déjà un index sur ip_start , voici comment l'utiliser au mieux, en supposant que vous souhaitiez faire un accès par IP (1234 dans cet exemple) :

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

Cela utilisera votre index pour démarrer une analyse qui s'arrête immédiatement à cause de la limit 1 . Le coût ne devrait être que légèrement supérieur à celui d'un simple accès indexé. Bien entendu, cette technique repose sur le fait que les plages définies par ip_start et ip_end ne se chevauchent jamais.

Le problème avec votre approche d'origine est que mysql, ignorant cette contrainte, ne peut utiliser l'index que pour déterminer où démarrer ou arrêter l'analyse dont (il pense) avoir besoin pour trouver toutes les correspondances pour votre requête.