(Esta resposta é direcionada ao esquema e SELECT.)
Como você antecipa milhões de linhas, primeiro quero destacar algumas melhorias no esquema.
-
FLOAT(m,n)geralmente é a coisa 'errada' a se fazer porque leva a dois arredondamentos. Ou useFLOATsimples (o que parece 'certo' para métricas como voltagem) ou useDECIMAL(m,n).FLOATé 4 bytes; nos casos indicados,DECIMALseria 3 ou 4 bytes.
-
Quando você tem ambosINDEX(a)eINDEX(a,b), a primeira é desnecessária, uma vez que a segunda pode cobrir tal. Você tem 3 chaves desnecessárias. Isso diminui a velocidade deINSERTs.
-
INT(3)-- Você está dizendo um "número de 3 dígitos"? Se sim, considereTINYINT UNSIGNED(valores 0..255) para 1 byte em vez deINTpara 4 bytes. Isso economizará muitos MB de espaço em disco, portanto, velocidade. (Veja tambémSMALLINT, etc, eSIGNEDouUNSIGNED.)
-
Sefilenameé repetido muito, você pode querer "normalizá-lo". Isso economizaria muitos MB.
-
UseNOT NULLa menos que você precise deNULLpara algo.
-
AUTO_INCREMENT=690892041implica que você está cerca de 1/3 do caminho para o desastre comid, que chegará a cerca de 2 bilhões. Você usaidpara qualquer coisa? Livrar-se da coluna evitaria o problema; e altere aUNIQUE KEYparaPRIMARY KEY. (Se você precisar deid, vamos falar mais.)
-
ENGINE=MyISAM-- A comutação tem algumas ramificações, tanto favoráveis quanto desfavoráveis. A mesa se tornaria 2-3 vezes maior. A escolha 'certa' dePRIMARY KEYaceleraria ainda mais istoSELECTsignificativamente. (E pode ou não desacelerar outrosSELECTs.)
Uma observação sobre o
SELECT :Desde string e unit_num são constantes na consulta, os dois últimos campos de ORDER BY timestamp asc, string asc, unit_num asc são desnecessários. Se forem relevantes por motivos não aparentes no SELECT , então meu conselho pode estar incompleto. este
WHERE filename = 'foobar'
AND unit_num='40'
AND string='2'
AND timestamp >= ...
é tratado de forma otimizada por
INDEX(filename, unit_name, string, timestamp) . A ordem das colunas não é importante exceto esse timestamp precisa ser último . Reorganizando o UNIQUE atual key, você fornece o índice ideal. (Enquanto isso, nenhum dos índices é muito bom para este SELECT .) Tornando-a a PRIMARY KEY e a tabela InnoDB tornaria ainda mais rápido. Particionamento? Nenhuma vantagem. Não para desempenho; não para qualquer outra coisa que você mencionou. Um uso comum para particionamento é para limpar 'antigos'. Se você pretende fazer isso, vamos conversar mais.
Em tabelas enormes, é melhor observar todos os
SELECTs importantes simultaneamente para não acelerarmos um enquanto demolimos a velocidade de outros. Ele pode até mesmo o particionamento ajuda nesse tipo de troca.