Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Armazenamento eficiente de dados de séries temporais:mySQL ou arquivos simples? Muitas tabelas (ou arquivos) ou consultas com condição WHERE?


Para responder a esta pergunta, devemos primeiro analisar o real problema que você está enfrentando.

O verdadeiro problema seria a combinação mais eficiente de gravação e recuperação de dados.

Vamos rever suas conclusões:

  • milhares de tabelas - bem, isso viola o propósito dos bancos de dados e dificulta o trabalho. Você também não ganha nada. Ainda há busca de disco envolvida, desta vez com muitos descritores de arquivo em uso. Você também precisa saber os nomes das tabelas, e existem milhares delas. Também é difícil extrair dados, para que servem os bancos de dados - estruturar os dados de tal forma que você possa facilmente fazer referência cruzada aos registros. Milhares de mesas - não eficientes de perf. ponto de vista. Não é eficiente do ponto de vista de uso. Má escolha.

  • um arquivo csv - provavelmente é excelente para buscar os dados, se você precisar de conteúdo inteiro de uma só vez. Mas está longe de ser remotamente bom para manipular ou transformar os dados. Dado o fato de que você depende de um layout específico - você deve ser extremamente cuidadoso ao escrever em CSV. Se isso crescer para milhares de arquivos CSV, você não fez um favor a si mesmo. Você removeu toda a sobrecarga do SQL (que não é tão grande), mas não fez nada para recuperar partes do conjunto de dados. Você também tem problemas para buscar dados históricos ou fazer referência cruzada a qualquer coisa. Má escolha.

O cenário ideal seria poder acessar qualquer parte do conjunto de dados de forma eficiente e rápida sem nenhum tipo de alteração de estrutura.

E é exatamente por isso que usamos bancos de dados relacionais e dedicamos servidores inteiros com muita RAM a esses bancos de dados.

No seu caso, você está usando tabelas MyISAM (extensão de arquivo .MYD). É um formato de armazenamento antigo que funcionou muito bem para hardware de baixo custo que foi usado na época. Mas hoje em dia temos computadores excelentes e rápidos. É por isso que usamos o InnoDB e permitimos que ele use muita RAM para que os custos de E/S sejam reduzidos. A variável em questão que a controla é chamada innodb_buffer_pool_size - pesquisando no Google que produzirá resultados significativos.

Para responder à pergunta - uma solução eficiente e satisfatória seria usar uma tabela onde você armazena as informações do sensor (id, título, descrição) e outra tabela onde você armazena as leituras do sensor. Você aloca RAM suficiente ou armazenamento suficientemente rápido (um SSD). As tabelas ficariam assim:
CREATE TABLE sensors ( 
    id int unsigned not null auto_increment,
    sensor_title varchar(255) not null,
    description varchar(255) not null,
    date_created datetime,
    PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

CREATE TABLE sensor_readings (
    id int unsigned not null auto_increment,
    sensor_id int unsigned not null,
    date_created datetime,
    reading_value varchar(255), -- note: this column's value might vary, I do not know what data type you need to hold value(s)
    PRIMARY KEY(id),
    FOREIGN KEY (sensor_id) REFERENCES sensors (id) ON DELETE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

O InnoDB, por padrão, usa um arquivo simples para todo o banco de dados/instalação. Isso alivia o problema de exceder o limite do descritor de arquivo do SO/sistema de arquivos. Vários, ou mesmo dezenas de milhões de registros não devem ser um problema se você alocar 5-6 GB de RAM para manter o conjunto de dados de trabalho na memória - isso permitiria acesso rápido aos dados.

Se eu fosse projetar tal sistema, esta seria a primeira abordagem que faria (pessoalmente). A partir daí, é fácil ajustar dependendo do que você precisa fazer com essa informação.