(Dette svar er rettet mod skemaet og SELECT.)
Da du forventer millioner af rækker, vil jeg først påpege nogle forbedringer af skemaet.
-
FLOAT(m,n)
er normalt den 'forkerte' ting at gøre, fordi det fører til to afrundinger. Brug enten almindeligFLOAT
(hvilket virker "rigtigt" for metrik som spænding) eller brugDECIMAL(m,n)
.FLOAT
er 4 bytes; i de angivne tilfældeDECIMAL
ville være 3 eller 4 bytes. -
Når du har både
INDEX(a)
ogINDEX(a,b)
, førstnævnte er unødvendigt, da sidstnævnte kan dække for sådanne. Du har 3 unødvendige NØGLER. Dette sænkerINSERTs
. -
INT(3)
-- Siger du et "3-cifret nummer"? Hvis ja, overvejTINYINT UNSIGNED
(værdier 0..255) for 1 byte i stedet forINT
for 4 bytes. Dette vil spare mange MB diskplads, deraf hastighed. (Se ogsåSMALLINT
osv. ogSIGNED
ellerUNSIGNED
.) -
Hvis
filename
gentages meget, vil du måske gerne "normalisere" det. Dette ville spare mange MB. -
Brug
NOT NULL
medmindre du har brug forNULL
for noget. -
AUTO_INCREMENT=690892041
antyder, at du er omkring 1/3 af vejen til katastrofe medid
, som vil toppe med omkring 2 mia. Bruger duid
for alt? At slippe af med kolonnen ville undgå problemet; og ændre denUNIQUE KEY
tilPRIMARY KEY
. (Hvis du har brug forid
, lad os tale videre.) -
ENGINE=MyISAM
-- Skift har nogle konsekvenser, både gunstige og ugunstige. Bordet ville blive 2-3 gange så stort. Det 'rigtige' valg afPRIMARY KEY
ville fremskynde dette yderligereSELECT
væsentligt. (Og kan eller kan ikke bremse andreSELECTs
.)
En bemærkning om SELECT
:Siden string
og unit_num
er konstanter i forespørgslen, de sidste to felter i ORDER BY timestamp asc, string asc, unit_num asc
er unødvendige. Hvis de er relevante af årsager, der ikke fremgår af SELECT
, så er mit råd måske ufuldstændigt.
Dette
WHERE filename = 'foobar'
AND unit_num='40'
AND string='2'
AND timestamp >= ...
håndteres optimalt af INDEX(filename, unit_name, string, timestamp)
. Rækkefølgen af kolonnerne er ikke vigtig undtagen det timestamp
skal være sidste . Omarrangerer den nuværende UNIQUE
nøgle, giver du dig det optimale indeks. (I mellemtiden er ingen af indekserne særlig gode til denne SELECT
.) Gør det til PRIMARY KEY
og tabellen InnoDB ville gøre det endnu hurtigere.
Opdeling? Ingen fordel. Ikke for ydeevne; ikke for noget andet du har nævnt. En almindelig anvendelse til partitionering er at rense 'gamle'. Hvis du har til hensigt at gøre sådan, lad os tale videre.
I store tabeller er det bedst at se på alle de vigtige SELECTs
samtidig, så vi ikke fremskynder én, mens vi ødelægger farten på andre. Det kan endda vise sig, at partitionering hjælper i denne form for afvejning.