(Ta odpowiedź jest skierowana do schematu i SELECT.)
Ponieważ przewidujesz miliony wierszy, najpierw chciałbym wskazać kilka ulepszeń w schemacie.
-
FLOAT(m,n)
jest zwykle „niewłaściwą” rzeczą, ponieważ prowadzi do dwóch zaokrągleń. Użyj zwykłegoFLOAT
(co wydaje się „właściwe” dla metryk takich jak napięcie) lub użyjDECIMAL(m,n)
.FLOAT
ma 4 bajty; w podanych przypadkachDECIMAL
będzie 3 lub 4 bajty. -
Gdy masz oba
INDEX(a)
iINDEX(a,b)
, to pierwsze jest niepotrzebne, ponieważ drugie może je pokrywać. Masz 3 niepotrzebne KLUCZE. Spowalnia toINSERTs
. -
INT(3)
-- Czy mówisz „numer 3-cyfrowy”? Jeśli tak, rozważTINYINT UNSIGNED
(wartości 0..255) dla 1 bajtu zamiastINT
na 4 bajty. Pozwoli to zaoszczędzić wiele MB miejsca na dysku, a tym samym szybkość. (Zobacz takżeSMALLINT
itp. iSIGNED
lubUNSIGNED
.) -
Jeśli
filename
często się powtarza, warto to „znormalizować”. Pozwoliłoby to zaoszczędzić wiele MB. -
Użyj
NOT NULL
chyba że potrzebujeszNULL
za coś. -
AUTO_INCREMENT=690892041
oznacza, że jesteś w około 1/3 drogi do katastrofy zid
, co wyniesie około 2 miliardów. Czy używaszid
za cokolwiek? Pozbycie się kolumny pozwoliłoby uniknąć problemu; i zmieńUNIQUE KEY
naPRIMARY KEY
. (Jeśli potrzebujeszid
, porozmawiajmy dalej). -
ENGINE=MyISAM
-- Zamiana ma pewne konsekwencje, zarówno korzystne, jak i niekorzystne. Stół stałby się 2-3 razy większy. „Właściwy” wybórPRIMARY KEY
jeszcze bardziej przyspieszy toSELECTs
znacznie. (I może, ale nie musi, spowolnić inneSELECTs
.)
Uwaga dotycząca SELECTs
:Od string
i unit_num
są stałymi w zapytaniu, ostatnie dwa pola ORDER BY timestamp asc, string asc, unit_num asc
są niepotrzebne. Jeśli są istotne z powodów niewidocznych w SELECTs
, wtedy moja rada może być niekompletna.
To
WHERE filename = 'foobar'
AND unit_num='40'
AND string='2'
AND timestamp >= ...
jest optymalnie obsługiwany przez INDEX(filename, unit_name, string, timestamp)
. Kolejność kolumn nie jest ważna z wyjątkiem ten timestamp
musi być ostatni . Zmiana układu bieżącego UNIQUE
klucz, dajesz optymalny indeks. (Tymczasem żaden z indeksów nie jest zbyt dobry dla tego SELECTs
.) Uczynienie z niego PRIMARY KEY
a tabela InnoDB sprawi, że będzie to jeszcze szybsze.
Partycjonowanie? Brak przewagi. Nie dla wydajności; nie za nic innego, o czym wspomniałeś. Częstym zastosowaniem partycjonowania jest czyszczenie „starych”. Jeśli zamierzasz to zrobić, porozmawiajmy dalej.
W dużych tabelach najlepiej jest spojrzeć na wszystkie ważne SELECTs
jednocześnie, abyśmy nie przyspieszali jednego, jednocześnie burząc prędkość innych. może nawet okazuje się, że partycjonowanie pomaga w tego rodzaju kompromisie.