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

MySQL sammensatte indekser og operatør MELLEM

Din stil er meget usædvanlig.

De fleste mennesker ville sandsynligvis skrive WHERE began_at < NOW() AND finished_at > NOW()

Imidlertid. Jeg vil anbefale at sætte et indeks på begge felter.

En kombineret nøgle vil ikke være til nytte for dig, fordi du det kun ville fremskynde søgen efter specifikke datokombinationer.

Nå, dette er ikke helt sandt, for hvis du bruger betree, vil en kombineret nøgle hjælpe dig, men ikke så god, som hvis du indekserer dem separat. Kombinerede nøgler er meget gode, hvis du søger kombinationer af felter med lighedsoperator (=). Enkelte feltindekser klarer sig bedre i ragen-anmodninger.

Du kan google lidt efter "multidimensional range search".

Årsagen er, at alle matchende felter i ét felt dybest set kan findes i log(n) tid i btrees.Så din samlede kørselstid vil være O(k*log(n)), hvilket er O(log(n)).

Multidimensional Range-forespørgsler har en kørselstid på O(sqrt(n)), hvilket er højere. Men der er også bedre implementeringer, som også opnår logaritmisk runtime. De er dog ikke fuldt implementeret i mysql, så det vil være værre eller forfærdeligt afhængigt af versionen.

Så lad mig opsummere:

  • Ligestillingssammenligninger på enkelte felter:hash-indeks (runtime O(1))

  • Områdesøgning på enkelte felter:btræindeks på enkelte felter ( O(log(n)) )

  • Ligestillingssøgning på flere felter:kombineret hash-nøgle (runtime O(1))

de sager er en klar ting...

  • Søg i rækkevidde på flere felter:separate btree-indekser ( O(log(n)) )

det er her det ikke er så klart. med de nuværende versioner er det klart bedre at indeksere separat på grund af de ovenfor anførte årsager. Med en perfekt implementering til den brug kan du opnå bedre ydeevne med kombinerede nøgler, men der er ikke noget system, der kender til, som understøtter it.mysql understøtter løse indekser (som du har brug for det) siden version 5.0, men kun meget begrænset, og forespørgselsoptimeringsværktøjet bruger dem kun i sjældne tilfælde afaik. kender ikke til nyere versioner som 5.3 eller noget.

men med mysql, der implementerer løse indekser, bliver kombinerede nøgler på felter, hvor du foretager rækkeanmodninger eller sorterer i forskellige retninger, mere og mere relevante.



  1. Konverter en strengdato til datetime i Oracle

  2. Brug af TUPLES til at sætte mere end 1000 indgange i SQL IN-sætning

  3. hvordan man henter flere resultatsæt fra en mysql-lagret procedure i laravel

  4. Ren måde at bruge postgresql vinduesfunktioner i django ORM?