2009-10-19 15 views
6

Sono in procinto di aggiungere una nuova funzionalità a un sistema. Il processo leggerà i dati in tempo reale dai PLC e li memorizzerà in un database. La tabella dati avrà 4 colonne: variable_id (SMALLINT), timestamp (TIMESTAMP), value (FLOAT), quality (TINYINT). La chiave primaria è (variable_id, timestamp).Qual è il miglior formato di tabella mysql per un carico di inserzione elevato?

Il sistema deve essere in grado di inserire 1000-2000 record al secondo.

La tabella di dati manterrà le ultime 24 ore di dati, i dati più vecchi vengono eliminati dalla tabella.

Anche la tabella dati deve gestire 5-10 istruzioni di selezione al secondo. L'istruzione select sta selezionando il valore più recente dalla tabella per una variabile specifica e la sta visualizzando sul web.

Devo utilizzare il formato tabella MyISAM o InnoDB? MyISAM blocca l'intera tabella mentre fa inserimenti, bloccando così le istruzioni select dall'interfaccia web? Attualmente tutte le tabelle di dati nel database sono tabelle MyISAM.

risposta

6

Devo utilizzare il formato tabella MyISAM o InnoDB?

Per qualsiasi progetto con frequenti letture e scritture contemporanee, è necessario utilizzare InnoDB.

MyISAM blocca l'intera tabella mentre esegue inserimenti, bloccando così le istruzioni di selezione dall'interfaccia web?

Con @@concurrent_insert abilitato, MyISAM può aggiungere righe inserite alla fine pur lettura contemporaneamente da un'altra sessione.

Tuttavia, se si dovesse mai fare qualcosa tranne lo INSERT, questo può fallire (ad esempio, la tabella si bloccherà).

Il sistema deve essere in grado di inserire 1000-2000 record al secondo.

Sarà meglio suddividere questi inserti e eseguirli in lotti.

InnoDB è molto più veloce in termini di righe al secondo rispetto alle transazioni al secondo.

La tabella di dati manterrà le ultime 24 ore di dati, i dati più vecchi vengono eliminati dalla tabella.

Si noti che InnoDB blocca tutte le righe esaminate, non solo quelle interessate.

Se la vostra dichiarazione DELETE potrà mai utilizzare un fullscan, la concomitante INSERTs fallirà (dal momento che il fullscan farà InnoDB per posizionare le serrature gap su tutti i record in rassegna tra cui l'ultimo).

+0

Bella risposta. +1 per te. –

2

MyISAM è più veloce e blocca l'intero tavolo. InnoDB è basato sulle transazioni, quindi eseguirà il blocco delle righe, ma è più lento.

+1

FWIW, ho avuto grandi prestazioni da InnoDB, ma MyISAM è molto, molto più veloce. Loro se la cavano perché disabilitano molti dei controlli di InnoDB. –

+0

Grazie per la risposta. Con MyISAM quando inserisco i record la tabella è bloccata per le istruzioni selezionate? Ad esempio, se un'istruzione di inserimento impiega 5 secondi per terminare (solo un numero casuale) l'istruzione di selezione deve attendere 5 secondi finché non restituisce il risultato? – thoraniann

+0

Penso che Quassnoi risponda a questa domanda - controlla il bit su @@ concurrent_insert. –

Problemi correlati