(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).FLOATer 4 bytes; i de angivne tilfældeDECIMALville 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 forINTfor 4 bytes. Dette vil spare mange MB diskplads, deraf hastighed. (Se ogsåSMALLINTosv. ogSIGNEDellerUNSIGNED.) -
Hvis
filenamegentages meget, vil du måske gerne "normalisere" det. Dette ville spare mange MB. -
Brug
NOT NULLmedmindre du har brug forNULLfor noget. -
AUTO_INCREMENT=690892041antyder, at du er omkring 1/3 af vejen til katastrofe medid, som vil toppe med omkring 2 mia. Bruger duidfor alt? At slippe af med kolonnen ville undgå problemet; og ændre denUNIQUE KEYtilPRIMARY 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 KEYville fremskynde dette yderligereSELECTvæ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.