sql >> Database teknologi >  >> RDS >> Mysql

Effektivt opslag i et områdetabel

Givet at du allerede har et indeks på ip_start , sådan bruger du det bedst, forudsat at du vil have én adgang pr. IP (1234 i dette eksempel):

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

Dette vil bruge dit indeks til at starte en scanning, som stopper øjeblikkeligt på grund af limit 1 . Omkostningerne bør kun være marginalt højere end omkostningerne ved en simpel indekseret adgang. Selvfølgelig er denne teknik afhængig af det faktum, at intervallerne defineret af ip_start og ip_end aldrig overlapper hinanden.

Problemet med din oprindelige tilgang er, at mysql, der er uvidende om denne begrænsning, kun kan bruge indekset til at bestemme, hvor den skal starte eller stoppe den scanning, som (den mener) den har brug for for at finde alle matches til din forespørgsel.



  1. Den returnerede datatype varierer baseret på data i tabellen

  2. Implementer Django-applikationen uden tjenesteafbrydelse / ingen nedetid

  3. Hvordan får jeg det aktuelle år ved hjælp af SQL på Oracle?

  4. MySQL LOAD DATA LOKAL INFILE eksempel i python?