Se c'è una cosa che posso dire su MySQL è che InnoDB, il suo motore di archiviazione transazionale (conforme ACID), è effettivamente multithread. Tuttavia, è multithread come LO CONFIGURA !!! Perfino "pronto all'uso", InnoDB funziona alla grande in un singolo ambiente CPU, date le sue impostazioni predefinite. Per sfruttare le funzionalità di multithreading di InnoDB, è necessario ricordare di attivare molte opzioni.
innodb_thread_concurrency imposta il limite superiore sul numero di thread simultanei che InnoDB può tenere aperti. Il miglior numero di round da impostare per questo è (2 X Numero di CPU) + Numero di dischi. AGGIORNAMENTO : Come ho appreso in prima persona dalla Conferenza di Percona a New York, dovresti impostarlo su 0 per avvisare InnoDB Storage Engine di trovare il miglior numero di thread per l'ambiente in cui è in esecuzione.
innodb_concurrency_tickets imposta il numero di thread che possono bypassare il controllo della concorrenza impunemente. Una volta raggiunto questo limite, il controllo della concorrenza dei thread diventa di nuovo la norma.
innodb_commit_concurrency imposta il numero di transazioni simultanee che possono essere impegnate. Poiché il valore predefinito è 0, la mancata impostazione consente a qualsiasi numero di transazioni di impegnarsi contemporaneamente.
innodb_thread_sleep_delay imposta il numero di millisecondi in cui un thread InnoDB può essere inattivo prima di rientrare nella coda InnoDB. L'impostazione predefinita è 10000 (10 sec).
innodb_read_io_threads e innodb_write_io_threads (entrambi da MySQL 5.1.38) allocare il numero specificato di thread per letture e scritture. L'impostazione predefinita è 4 e il massimo è 64.
innodb_replication_delay impone che il ritardo del thread su uno slave sia raggiunto innodb_thread_concurrency
innodb_read_ahead_threshold consente letture lineari del numero di estensioni impostato (64 pagine [pagina = 16K]) prima di passare alla lettura asincrona.
Il tempo mi sfuggirebbe se nominassi più opzioni. Puoi leggerli nella documentazione di MySQL .
La maggior parte delle persone non è a conoscenza di queste funzionalità e è abbastanza soddisfatta di InnoDB che sta effettuando transazioni conformi a ACID. Se modifichi una di queste opzioni, lo fai a tuo rischio e pericolo.
Ho giocato con le istanze di pool di buffer multipli di MySQL 5.5 (162 GB in 9 istanze di pool di buffer) e ho tentato di partizionare automaticamente i dati in memoria in questo modo. Alcuni esperti affermano che questo dovrebbe darti un miglioramento delle prestazioni del 50%. Quello che ho ottenuto è stato un sacco di blocco del thread che ha effettivamente fatto strisciare InnoDB. Sono passato a 1 buffer (162 GB) e tutto andava bene di nuovo al mondo. Immagino che tu abbia bisogno degli esperti Percona a tua disposizione per impostare questo. Domani sarò alla conferenza PercQL MySQL a New York e chiederò a questo proposito se l'opportunità si offre da sola.
In conclusione, InnoDB si comporta bene ora in un server multi-CPU date le sue impostazioni predefinite per le operazioni multithread. Ottimizzarli richiede molta cura, grande pazienza, ottima documentazione e ottimo caffè (o Red Bull, Jolt, ecc.).
Buongiorno, buonasera e buona notte !!!
AGGIORNAMENTO 2011-05-27 20:11
Sono tornato dalla conferenza MySQL di Percona a New York giovedì. Che conferenza. Ho imparato molto, ma ho una risposta che esaminerò in merito a InnoDB. Sono stato informato da Ronald Bradford che l'impostazione di innodb_thread_concurrency su 0 consentirà a InnoDB di decidere internamente il miglior modo di agire internamente con la concorrenza dei thread. Lo sperimenterò ulteriormente in MySQL 5.5.
AGGIORNAMENTO 2011-06-01 11:20
Per quanto riguarda una lunga query, InnoDB è conforme ACID e funziona molto bene utilizzando il controllo di concorrenza MultiVersion . Le transazioni dovrebbero essere in grado di trasportare livelli di isolamento (letture ripetibili per impostazione predefinita) che impediscono ad altri di accedere ai dati.
Per quanto riguarda i sistemi multi core, InnoDB ha fatto molta strada. In passato, InnoDB non poteva funzionare bene in un ambiente multicore. Ricordo di dover eseguire più istanze mysql su un singolo server per far sì che più core distribuissero i vari processi mysqld attraverso le CPU. Questo non è più necessario, grazie a Percona e successivamente a MySQL (eh, Oracle, dicendo che mi fa ancora vomitare), poiché hanno sviluppato InnoDB in un motore di archiviazione più maturo che può accedere ai core con semplicità senza molta ottimizzazione. L'attuale istanza di InnoDB oggi può funzionare bene in un singolo server core.