(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)
.FLOAT
je 4 bajty; v uvedených případechDECIMAL
bude 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ístoINT
pro 4 bajty. To ušetří mnoho MB místa na disku, a tím i rychlost. (Viz takéSMALLINT
, atd. aSIGNED
neboUNSIGNED
.) -
Pokud
filename
se hodně opakuje, možná to budete chtít "normalizovat". To by ušetřilo mnoho MB. -
Použijte
NOT NULL
pokud nepotřebujeteNULL
za něco. -
AUTO_INCREMENT=690892041
znamená, že sid
jste asi v 1/3 cesty ke katastrofě , což bude na vrcholu asi 2 miliard. Používáteid
za cokoli? Zbavením se sloupce by se předešlo problému; a změňteUNIQUE KEY
naPRIMARY 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 KEY
by to dále urychlilo toSELECTs
vý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.