(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).FLOATma 4 bajty; w podanych przypadkachDECIMALbę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 zamiastINTna 4 bajty. Pozwoli to zaoszczędzić wiele MB miejsca na dysku, a tym samym szybkość. (Zobacz takżeSMALLINTitp. iSIGNEDlubUNSIGNED.) -
Jeśli
filenameczęsto się powtarza, warto to „znormalizować”. Pozwoliłoby to zaoszczędzić wiele MB. -
Użyj
NOT NULLchyba że potrzebujeszNULLza coś. -
AUTO_INCREMENT=690892041oznacza, że jesteś w około 1/3 drogi do katastrofy zid, co wyniesie około 2 miliardów. Czy używaszidza cokolwiek? Pozbycie się kolumny pozwoliłoby uniknąć problemu; i zmieńUNIQUE KEYnaPRIMARY 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 KEYjeszcze bardziej przyspieszy toSELECTsznacznie. (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.