sql >> Database >  >> RDS >> Mysql

Efficiënt opzoeken in een bereiktabel

Aangezien je al een index hebt op ip_start , dit is hoe je het het beste kunt gebruiken, ervan uitgaande dat je één toegang per IP wilt maken (1234 in dit voorbeeld):

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

Dit zal uw index gebruiken om een ​​scan te starten die onmiddellijk stopt vanwege de limit 1 . De kosten zouden slechts marginaal hoger moeten zijn dan die van een eenvoudige geïndexeerde toegang. Deze techniek is natuurlijk gebaseerd op het feit dat de bereiken gedefinieerd door ip_start en ip_end overlappen elkaar nooit.

Het probleem met uw oorspronkelijke aanpak is dat mysql, die zich niet bewust is van deze beperking, de index alleen kan gebruiken om te bepalen waar de scan moet worden gestart of gestopt die (het denkt) nodig is om alle overeenkomsten voor uw zoekopdracht te vinden.



  1. kunnen we het Unix-commando van de Oracle10g-procedure uitvoeren?

  2. VOEG WAARDEN IN WAAR NIET BESTAAT

  3. Vergelijkbare nummerpatronen zoeken in de tabel

  4. postgres db-bestanden - welk bestand vertegenwoordigt de specifieke tabel/index?