Egentligen har din primära nyckel ingen mening när det gäller en sådan intervallfråga. Det indikerar bara unika par för <from_ip, to_ip>
tuple - alltså kommer MySQL inte att kunna använda det indexet med sådana intervalljämförelser.
Om du inte kör någon fråga som involverar båda delarna av din primärnyckel, kommer den inte att ha någon effekt (ja, faktiskt, MySQL kommer också att använda den - när urvalsvillkoret använder vänster-underuppsättning av sammansatt index , men det är inte ditt fall). Till exempel kommer detta att använda primärnyckel:
-- @x and @y are derived from somewhere else
SELECT * FROM inetnum WHERE [email protected] && [email protected]
I ditt fall kan sammansatt nyckel vara primärnyckel, ja, men det är bara fördelen - att ge unikhet. Så du kan lämna det som det är, eller skapa surrogat id
primärnyckel (ersätter nuvarande primärnyckel med UNIQUE
begränsning).
En av möjliga lösningar för att förbättra situationen kan vara - skapa nycklar med en kolumn för from_ip
och to_ip
. Eftersom de är heltal, finns det en god chans för hög kardinalitet, som resultatindex kommer att ha. MySQL kan dock bara använda ett index, och därför kommer du att förlora "hälften" av räckviddseffektiv jämförelse. Du bör också komma ihåg att om en jämförelse som är större än (eller mindre än) påverkar för många rader, kommer MySQL att Använd inte index också (eftersom det uppenbarligen inte är någon mening med det eftersom det finns för många rader att välja).
Och - ja, undvik att använda funktioner i WHERE
klausul. Jag säger inte att MySQL alltid kommer att förlora indexanvändning i sådana fall (men troligtvis kommer det att förlora det i de flesta fall) - men tänk på overhead som kommer att orsaka funktionsanrop. Även om det är lite - du kan alltid bli av med det genom att skicka rätt värde, bildat av din ansökan.