Devo scrivere nel database MySQL un sacco di dati per circa 5 volte al secondo. Qual è il modo più veloce: inserire ogni 1/5 di secondo o fare una coda e inserire tutti i dati memorizzati ogni ~ 5 secondi? Se la seconda via è migliore - è possibile inserire in 1 tabella usando 1 richiesta poche righe?Inserimento nella banca dati
risposta
Considerando la frequenza delle inserzioni sua meglio a vai con il secondo approccio che è in coda e che aggiungere in una volta.!
ma si dovrebbe prendere in considerazione questi scenari prima:
È il vostro sistema in tempo reale.? Sì, qual è il ritardo massimo che puoi permetterti (poiché ci vorranno ~ 5 secondi per il successivo inserimento e i dati saranno mantenuti/disponibili)?
Quali sono le probabilità che Errori/valori errati vengano immessi nei dati, come se un dato non fosse corretto perderai il resto tutti se la query dovesse fallire.
Utilizzo di più pool di buffer con innodb_buffer_pool_instances
. può dipendere dal numero di core onmachine. Utilizzare Partitioning
della tabella.
È possibile inserire collettivamente i dati utilizzando XML
.
Si può fare un inserto con tutti i dati senz qualcosa di simile:
INSERT INTO table (field1, field2,... , fieldN)
VALUES
(value1_1', value1_2,... , value1_N),
(value2_1', value2_2,... , value2_N),
...
(valueM_1', valueM_2,... , valueM_N);
Come ogni transazione viene fornito con un costo fisso, direi che facendo un multi-linea di inserire ogni pochi secondi è meglio . Con alcuni dei sistemi che utilizziamo al lavoro memorizziamo centinaia di righe in cache prima di inserirle tutte in una volta.
Dal MySQL documentation si può fare un multi-linea di inserire in questo modo:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
mia esperienza è che quando si inseriscono i dati in un database MySQL è più veloce di lavorare con lotti.
Quindi l'opzione lento sta eseguendo più query di inserimento:
INSERT INTO my_table VALUES (1, "a"); INSERT INTO my_table VALUES (2, "b");
L'opzione più veloce sarebbe:
INSERT INTO my_table VALUES (1, "a"), (2, "b");
- 1. Store IPv6 nella banca dati
- 2. Memorizza ora data UTC nella banca dati
- 3. Modellazione di valuta nella banca dati
- 4. Biztalk messaggi sospesi nella banca dati
- 5. Conservare il certificato X509 nella banca dati
- 6. gestione delle righe cronologiche nella banca dati
- 7. Rails: memorizzare le traduzioni nella banca dati
- 8. Attributo set Bookshelf.js non nella banca dati
- 9. Traduzioni e Symfony2 nella banca dati
- 10. WooCommerce: ricerca dei prodotti nella banca dati
- 11. Crittografia dei dati per l'archiviazione nella banca dati
- 12. inserire più dati nella banca dati in Yii 2
- 13. Inserire record di set di dati nella banca dati
- 14. avvertimento banca dati remove
- 15. banca dati Geocode
- 16. banca dati CTAG per Go
- 17. Differenza tra sessione nel file e nella banca dati
- 18. Cerca e sostituisci parte della stringa nella banca dati
- 19. Limite minimo e valore limite SQL nella banca dati
- 20. Ora joda DateTime memorizza in modo errato nella banca dati
- 21. memorizzano le immagini nella banca dati o su file system
- 22. ef 5 codefirst enum collezione non generata nella banca dati
- 23. banca dati cakephp non trovato
- 24. Django banca dati runserver personalizzato
- 25. banca dati con Crystal Reports
- 26. GWT - immagine dalla banca dati
- 27. come far cadere banca dati
- 28. origini dati idea intellij non vede la tabella esistente nella banca dati
- 29. in grado di aggiornare i dati nella banca dati attraverso la forma CakePHP
- 30. ERRORE 1049 (42000): banca dati Unknown
Sì, il sistema è in tempo reale. I dati sono semplici base64 con ~ 100 byte di dati. – Ockonal
Se così fosse, andrei con un singolo inserimento e con Connection Pooling sul livello DAO. Poiché non puoi permetterti di perdere dati in RTS, anche il tempo è fondamentale.! Spero che questo ti abbia aiutato. :) –
Grazie per l'aiuto;) – Ockonal