sql >> Databasteknik >  >> RDS >> Mysql

MySQL sammansatta index och operatör MELLAN

Din stil är mycket ovanlig.

De flesta skulle förmodligen skriva WHERE began_at < NOW() AND finished_at > NOW()

I alla fall. Jag skulle rekommendera att sätta ett index på båda fälten.

En kombinerad nyckel kommer inte att vara till nytta för dig eftersom det bara skulle snabba upp sökaren för specifika datumkombinationer.

Tja, detta är inte helt sant för om du använder betree kommer en kombinerad nyckel att hjälpa dig men inte lika bra som om du indexerar dem separat. Kombinerade nycklar är mycket bra om du söker efter kombinationer av fält med operatorn likhet (=). Enkla fältindex presterar bättre i ragen-förfrågningar.

Du kan googla lite efter "multidimensional range search".

Anledningen är att alla matchande fält i ett fält i princip kan hittas i log(n)-tid i btrees. Så din totala körtid blir O(k*log(n)) vilket är O(log(n)).

Flerdimensionella intervallfrågor har en körtid på O(sqrt(n)), vilket är högre. Men det finns också bättre implementeringar som också uppnår logaritmisk körtid. De är dock inte fullt implementerade i mysql, så det blir sämre eller hemskt beroende på version.

Så låt mig sammanfatta:

  • Jämlikhetsjämförelser på enstaka fält:hashindex (runtime O(1))

  • Områdessökning på enstaka fält:btree index på enstaka fält ( O(log(n)) )

  • Jämlikhetssökning på flera fält:kombinerad hash-nyckel (runtime O(1))

de fallen är en klar sak...

  • Räckviddssökning på flera fält:separata bträdindex ( O(log(n)) )

det är här det inte är så tydligt. med nuvarande versioner är det klart bättre att indexera separat på grund av skälen ovan. Med en perfekt implementering för det användningsfallet kan du uppnå bättre prestanda med kombinerade nycklar, men det finns inget system som är känt som stöder it.mysql stöder lösa index (vilket du behöver för det) sedan version 5.0, men bara mycket begränsad och frågeoptimeraren använder dem bara i sällsynta fall. vet inte om nyare versioner som 5.3 eller något.

Men med mysql som implementerar lösa index blir kombinerade nycklar på fält där du gör intervallförfrågningar eller sortering i olika riktningar mer och mer relevanta.



  1. Python List till PostgreSQL Array

  2. Grundläggande om parallellprogrammering med Fork/Join Framework i Java

  3. org.hibernate.HibernateException:Databasen returnerade inget naturligt genererat identitetsvärde

  4. mysql datumlista med räkning även om ingen data på specifikt datum