Mysql
 sql >> Database >  >> RDS >> Mysql

Archiviazione efficiente dei dati delle serie temporali:MySQL o file flat? Molte tabelle (o file) o query con condizione WHERE?

Per rispondere a questa domanda, dobbiamo prima analizzare il reale problema che stai affrontando.

Il vero problema sarebbe la combinazione più efficiente di scrittura e recupero dei dati.

Esaminiamo le tue conclusioni:

  • migliaia di tavoli - beh, ciò viola lo scopo dei database e rende più difficile lavorarci. Anche tu non guadagni nulla. È ancora coinvolta la ricerca del disco, questa volta con molti descrittori di file in uso. Devi anche conoscere i nomi dei tavoli e ce ne sono migliaia. È anche difficile estrarre i dati, che è lo scopo dei database:strutturare i dati in modo tale da poter fare facilmente riferimento incrociato ai record. Migliaia di tavoli - non efficienti da perf. punto di vista. Non efficiente dal punto di vista dell'utilizzo. Cattiva scelta.

  • un file CSV - è probabilmente eccellente per recuperare i dati, se hai bisogno di interi contenuti in una volta. Ma è tutt'altro che lontanamente buono per manipolare o trasformare i dati. Dato che ti affidi a un layout specifico, devi stare molto attento mentre scrivi su CSV. Se questo cresce fino a migliaia di file CSV, non ti sei fatto un favore. Hai rimosso tutto il sovraccarico di SQL (che non è così grande) ma non hai fatto nulla per recuperare parti del set di dati. Hai anche problemi a recuperare dati storici o fare riferimenti incrociati a qualsiasi cosa. Cattiva scelta.

Lo scenario ideale sarebbe poter accedere a qualsiasi parte del set di dati in modo efficiente e rapido senza alcun tipo di modifica della struttura.

E questo è esattamente il motivo per cui utilizziamo database relazionali e perché a quei database dedichiamo interi server con molta RAM.

Nel tuo caso, stai utilizzando le tabelle MyISAM (estensione file .MYD). È un vecchio formato di archiviazione che funzionava benissimo per l'hardware di fascia bassa che veniva utilizzato in passato. Ma al giorno d'oggi abbiamo computer eccellenti e veloci. Ecco perché utilizziamo InnoDB e gli consentiamo di utilizzare molta RAM in modo da ridurre i costi di I/O. La variabile in questione che la controlla si chiama innodb_buffer_pool_size - Google che produrrà risultati significativi.

Per rispondere alla domanda, una soluzione efficiente e soddisfacente sarebbe quella di utilizzare una tabella in cui si memorizzano le informazioni del sensore (id, titolo, descrizione) e un'altra tabella in cui si memorizzano le letture del sensore. Assegni RAM sufficiente o spazio di archiviazione sufficientemente veloce (un SSD). Le tabelle sarebbero così:

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;

InnoDB, per impostazione predefinita, utilizza un file flat per l'intero database/installazione. Ciò allevia il problema del superamento del limite del descrittore di file del sistema operativo / filesystem. Diversi, o addirittura decine di milioni di record non dovrebbero essere un problema se dovessi allocare 5-6 giga di RAM per mantenere in memoria il set di dati di lavoro, ciò ti consentirebbe un rapido accesso ai dati.

Se dovessi progettare un tale sistema, questo è il primo approccio che farei (personalmente). Da lì in poi è facile regolare a seconda di cosa devi fare con tali informazioni.