(Tato odpověď je zaměřena na schéma a SELECT.)
Vzhledem k tomu, že očekáváte miliony řádků, chci nejprve upozornit na některá vylepšení schématu.
-
FLOAT(m,n)je obvykle 'špatná' věc, protože to vede ke dvěma zaokrouhlování. Buď použijte obyčejnýFLOAT(což se zdá „správné“ pro metriky jako napětí) nebo použijteDECIMAL(m,n).FLOATje 4 bajty; v uvedených případechDECIMALbude 3 nebo 4 bajty. -
Když máte oba
INDEX(a)aINDEX(a,b), první je zbytečný, protože druhý může takové pokrýt. Máte 3 zbytečné KLÍČE. To zpomalujeINSERTs. -
INT(3)-- Říkáte "3místné číslo"? Pokud ano, zvažteTINYINT UNSIGNED(hodnoty 0..255) pro 1 bajt místoINTpro 4 bajty. To ušetří mnoho MB místa na disku, a tím i rychlost. (Viz takéSMALLINT, atd. aSIGNEDneboUNSIGNED.) -
Pokud
filenamese hodně opakuje, možná to budete chtít "normalizovat". To by ušetřilo mnoho MB. -
Použijte
NOT NULLpokud nepotřebujeteNULLza něco. -
AUTO_INCREMENT=690892041znamená, že sidjste asi v 1/3 cesty ke katastrofě , což bude na vrcholu asi 2 miliard. Používáteidza cokoli? Zbavením se sloupce by se předešlo problému; a změňteUNIQUE KEYnaPRIMARY KEY. (Pokud potřebujeteid, pojďme mluvit dále.) -
ENGINE=MyISAM-- Přepínání má určité důsledky, příznivé i nepříznivé. Stůl by byl 2-3krát větší. „Správná“ volbaPRIMARY KEYby to dále urychlilo toSELECTsvýrazně. (A může nebo nemusí zpomalit dalšíSELECTs.)
Poznámka k SELECTs :Od string a unit_num jsou konstanty v dotazu, poslední dvě pole ORDER BY timestamp asc, string asc, unit_num asc jsou zbytečné. Pokud jsou relevantní z důvodů, které nejsou patrné v SELECTs , pak moje rada může být neúplná.
Toto
WHERE filename = 'foobar'
AND unit_num='40'
AND string='2'
AND timestamp >= ...
je optimálně zpracován pomocí INDEX(filename, unit_name, string, timestamp) . Pořadí sloupců není důležité kromě toto timestamp musí být poslední . Změna uspořádání aktuálního UNIQUE získáte optimální index. (Mezitím žádný z indexů není pro tento SELECTs příliš dobrý .) Udělat z něj PRIMARY KEY a tabulka InnoDB by to ještě zrychlila.
Dělení oddílů? Žádná výhoda. Ne pro výkon; ne pro nic jiného, co jste zmínil. Běžné použití pro dělení je pro vyčištění 'starého'. Pokud to máte v úmyslu udělat, promluvme si dále.
V obrovských tabulkách je nejlepší podívat se na všechny důležité SELECTs současně, abychom jednoho nezrychlili a nezničili rychlost ostatních. může dokonce se ukázalo, že rozdělení pomáhá v tomto druhu kompromisu.