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

MySQL:dividere una tabella di grandi dimensioni in partizioni o tabelle separate?

Bene, se speri in una nuova risposta, significa che probabilmente hai letto le mie risposte e sembro un disco rotto. Vedi blog sul partizionamento per i pochi casi d'uso in cui il partizionamento può aiutare le prestazioni. Il tuo non suona come uno qualsiasi dei 4 casi.

Riduci device_id . INT è 4 byte; hai davvero milioni di dispositivi? TINYINT UNSIGNED è 1 byte e un intervallo di 0..255. SMALLINT UNSIGNED è 2 byte e un intervallo di 0..64K. Ciò ridurrà un po' il tavolo.

Se sei reale la domanda riguarda come gestire così tanti dati, quindi "pensare fuori dagli schemi". Continua a leggere.

Rappresentazione grafica... Quali intervalli di date stai rappresentando graficamente?

  • L'"ultima" ora/giorno/settimana/mese/anno?
  • Un'ora/giorno/settimana/mese/anno arbitrario?
  • Un intervallo arbitrario, non legato ai limiti di giorno/settimana/mese/anno?

Cosa stai rappresentando graficamente?

  • Valore medio su un giorno?
  • Max/min nell'arco della giornata?
  • Candelieri (ecc.) per giorno o settimana o altro?

Indipendentemente dal caso, è necessario creare (e mantenere in modo incrementale) una tabella di riepilogo con i dati. Una riga conterrebbe informazioni di riepilogo per un'ora. Suggerirei

CREATE TABLE Summary (
    device_id SMALLINT UNSIGNED NOT NULL,
    sensor_id TINYINT UNSIGNED NOT NULL,
    hr TIMESTAMP NOT NULL,
    avg_val FLOAT NOT NULL,
    min_val FLOAT NOT NULL,
    max_val FLOAT NOT NULL
    PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;

L'unica tabella di riepilogo potrebbe essere 9 GB (per la quantità attuale di dati).

SELECT hr,
       avg_val,
       min_val,
       max_val
    FROM Summary
    WHERE device_id = ?
      AND sensor_id = ?
      AND hr >= ?
      AND hr  < ? + INTERVAL 20 DAY;

Ti darebbe i valori hi/lo/avg per 480 ore; abbastanza per rappresentare graficamente? L'acquisizione di 480 righe dalla tabella di riepilogo è molto più veloce dell'acquisizione di 60*480 righe dalla tabella di dati grezzi.

Ottenere dati simili per un anno probabilmente soffocherebbe un pacchetto grafico, quindi potrebbe vale la pena costruire un riassunto del riassunto -- con risoluzione di un giorno. Sarebbe circa 0,4 GB.

Esistono diversi modi per creare le tabelle di riepilogo; possiamo discuterne dopo aver riflettuto sulla sua bellezza e aver letto il Blog delle tabelle di riepilogo . Potrebbe essere che la raccolta di un'ora di dati, quindi l'aumento della tabella di riepilogo, sia il modo migliore. Sarebbe un po' come il flip-flop discusso il mio blog Staging table .

E, se avessi i riepiloghi orari, hai davvero bisogno dei dati minuto per minuto? Considera di buttarlo via. O forse dati dopo, diciamo, un mese. Ciò porta all'utilizzo del partizionamento, ma solo per il suo vantaggio nell'eliminazione dei vecchi dati come discusso nel "Caso 1" di blog sul partizionamento . Cioè, avresti partizioni giornaliere, usando DROP e REORGANIZE tutte le sere per spostare l'ora della tavola "Fatto". Ciò porterebbe a ridurre l'ingombro di 145 GB, ma senza perdere molti dati. Nuovo footprint:circa 12 GB (riepilogo orario + dettagli minuto per minuto degli ultimi 30 giorni)

PS:il blog della tabella riepilogativa mostra come ottenere la deviazione standard.