sql >> Databasteknik >  >> RDS >> Mysql

Effektiv sökning i en intervalltabell

Med tanke på att du redan har ett index på ip_start , så här använder du det bäst, förutsatt att du vill göra en åtkomst per IP (1234 i det här exemplet):

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

Detta kommer att använda ditt index för att starta en skanning som slutar omedelbart på grund av limit 1 . Kostnaden bör endast vara marginellt högre än den för en enkel indexerad access. Naturligtvis förlitar sig denna teknik på det faktum att de intervall som definieras av ip_start och ip_end aldrig överlappa.

Problemet med ditt ursprungliga tillvägagångssätt är att mysql, som inte är medveten om denna begränsning, bara kan använda indexet för att avgöra var den ska börja eller stoppa skanningen som (den tror) den behöver för att hitta alla matchningar för din fråga.



  1. SQL Server XML-fråga med flera namnområden

  2. mysql insert bara om det inte finns fungerar inte

  3. Vad är ett databasschema?

  4. Hur skapar man index på JSON-fältet i Postgres?