É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.