Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Effizientes Nachschlagen in einer Bereichstabelle

Vorausgesetzt, Sie haben bereits einen Index auf ip_start , so verwenden Sie es am besten, vorausgesetzt, Sie möchten einen Zugriff pro IP (1234 in diesem Beispiel):

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

Dadurch wird Ihr Index verwendet, um einen Scan zu starten, der aufgrund des limit 1 sofort stoppt . Die Kosten sollten nur unwesentlich höher sein als die eines einfachen indexierten Zugriffs. Natürlich beruht diese Technik auf der Tatsache, dass die durch ip_start definierten Bereiche und ip_end niemals überlappen.

Das Problem mit Ihrem ursprünglichen Ansatz ist, dass mysql, da es sich dieser Einschränkung nicht bewusst ist, den Index nur verwenden kann, um zu bestimmen, wo der Scan gestartet oder gestoppt werden soll, den es (meiner Meinung nach) benötigt, um alle Übereinstimmungen für Ihre Abfrage zu finden.