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

Effektiv datamodel til rækkeviddeforespørgsler

Faktisk har din primære nøgle ringe mening med hensyn til en sådan rækkeviddeforespørgsel. Det angiver kun unikke par for <from_ip, to_ip> tuple - MySQL vil derfor ikke være i stand til at bruge det indeks med sådanne intervalsammenligninger.

Medmindre du kører en forespørgsel, der involverer begge dele af din primære nøgle, vil den ikke have nogen effekt (nå ja, faktisk vil MySQL også bruge den - når valgbetingelsen bruger venstre undersæt af sammensat indeks , men det er ikke din sag). For eksempel vil dette bruge primærnøgle:

-- @x and @y are derived from somewhere else
SELECT * FROM inetnum WHERE [email protected] && [email protected]

I dit tilfælde kan sammensat nøgle være primær nøgle, ja, men det er kun en fordel - at give unikhed. Så du kan lade det være som det er, eller oprette surrogat id primærnøgle (erstatter nuværende primærnøgle med UNIQUE begrænsning).

En af mulige løsninger til at forbedre situationen kunne være - oprette enkeltkolonnenøgler til from_ip og to_ip . Da de er heltal, er der en god chance for høj kardinalitet, som resultatindekser vil have. MySQL kan dog kun bruge ét indeks, og du vil derfor miste 'halvdelen' af rækkeviddeeffektiv sammenligning. Du skal også huske, at hvis sammenligning større end (eller mindre end) vil påvirke for mange rækker, vil MySQL ikke bruge indeks så godt (da det åbenbart ikke er nogen mening i det, fordi der er for mange rækker at vælge).

Og - ja, undgå at bruge funktioner i WHERE klausul. Jeg siger ikke, at MySQL altid vil miste indeksbrug i sådanne tilfælde (men højst sandsynligt vil det miste det i de fleste tilfælde) - men tænk på overhead, der vil forårsage funktionskald. Selvom det er lidt - du kan altid slippe af med det ved at sende den korrekte værdi, dannet af din ansøgning.



  1. MySQL vælger max record i gruppe efter

  2. Introduktion til PL/SQL-indsamlingsmetoder i Oracle-databasen

  3. Ignorerer apostrof i mysql-søgninger

  4. Problemer med RODBC sqlSave