Jika ada satu hal yang dapat saya katakan tentang MySQL adalah InnoDB, mesin penyimpanan transaksionalnya (ACID-compliant), memang multithreaded. Namun, itu multithreaded seperti ANDA MENGONFIGURASINYA !!! Bahkan tepat "di luar kotak," InnoDB berkinerja bagus dalam lingkungan CPU tunggal mengingat pengaturan defaultnya. Untuk memanfaatkan kemampuan multithreading InnoDB, Anda harus ingat untuk mengaktifkan banyak opsi.
innodb_thread_concurrency menetapkan batas atas jumlah utas bersamaan yang bisa dibuka oleh InnoDB. Nomor bulat terbaik untuk ditetapkan untuk ini adalah (2 X Jumlah CPU) + Jumlah Disk. UPDATE : Seperti yang saya pelajari secara langsung dari Percona NYC Conference, Anda harus mengatur ini ke 0 untuk mengingatkan InnoDB Storage Engine untuk menemukan jumlah utas terbaik untuk lingkungan tempat ia berjalan.
innodb_concurrency_tickets menetapkan jumlah utas yang dapat melewati pemeriksaan konkurensi dengan impunitas. Setelah batas itu tercapai, pengecekan konkurensi thread menjadi norma lagi.
innodb_commit_concurrency menetapkan jumlah transaksi bersamaan yang dapat dilakukan. Karena defaultnya adalah 0, tidak menetapkan ini memungkinkan sejumlah transaksi untuk melakukan secara bersamaan.
innodb_thread_sleep_delay menetapkan jumlah milidetik yang dapat dinonaktifkan oleh InnoDB sebelum masuk kembali ke antrian InnoDB. Standarnya adalah 10.000 (10 detik).
innodb_read_io_threads dan innodb_write_io_threads (keduanya sejak MySQL 5.1.38) mengalokasikan jumlah utas yang ditentukan untuk membaca dan menulis. Default adalah 4 dan maksimum 64.
innodb_replication_delay memberlakukan keterlambatan utas pada seorang budak adalah Innodb_thread_concurrency tercapai.
innodb_read_ahead_threshold memungkinkan pembacaan linear dari jumlah luasan yang ditetapkan (64 halaman [halaman = 16K]) sebelum beralih ke pembacaan asinkron.
Waktu akan luput dari saya jika saya menyebutkan lebih banyak opsi. Anda dapat membacanya di Dokumentasi MySQL .
Kebanyakan orang tidak mengetahui fitur-fitur ini dan cukup puas dengan InnoDB hanya melakukan transaksi yang sesuai dengan ACID. Jika Anda mengubah salah satu opsi ini, Anda melakukannya dengan risiko sendiri.
Saya telah bermain dengan MySQL 5.5 Multiple Buffer Pool Instances (162GB dalam 9 buffer pools instance) dan telah berupaya membuat data yang dipartisi secara otomatis dalam memori dengan cara ini. Beberapa ahli mengatakan bahwa ini akan memberi Anda peningkatan kinerja 50%. Apa yang saya dapatkan adalah satu ton penguncian utas yang sebenarnya membuat InnoDB merangkak. Saya beralih ke 1 buffer (162GB) dan semuanya baik-baik saja di dunia. Saya kira Anda membutuhkan ahli Percona yang Anda inginkan untuk mengatur ini. Saya akan berada di Konferensi MySQL Percona di New York besok dan akan menanyakan hal ini jika ada peluang.
Sebagai kesimpulan, InnoDB berperilaku baik sekarang di server multi-CPU mengingat pengaturan default untuk operasi multithreaded. Tweak mereka sangat hati-hati, kesabaran, dokumentasi yang bagus, dan kopi yang enak (atau Red Bull, Goncangan, dll.).
Selamat pagi, selamat malam, dan selamat malam !!!
UPDATE 2011-05-27 20:11
Kembali dari Percona MySQL Conference di New York pada hari Kamis. Konferensi yang luar biasa. Belajar banyak, tapi saya mendapat jawaban saya akan melihat tentang InnoDB. Saya diberitahu oleh Ronald Bradford bahwa menetapkan innodb_thread_concurrency ke 0 akan membuat InnoDB memutuskan tindakan terbaik secara internal dengan thread concurrency. Saya akan bereksperimen dengan ini lebih lanjut di MySQL 5.5.
UPDATE 2011-06-01 11:20
Sejauh satu permintaan panjang, InnoDB adalah ACID-compliant dan beroperasi dengan sangat baik menggunakan MultiVersion Concurrency Control . Transaksi harus dapat membawa tingkat isolasi (dibaca berulang secara default) yang mencegah pemblokiran orang lain dari mengakses data.
Adapun sistem multi-inti, InnoDB telah datang jauh. Di masa lalu, InnoDB tidak dapat bekerja dengan baik di lingkungan multicore. Saya ingat harus menjalankan beberapa instance mysql pada satu server untuk mendapatkan beberapa core untuk mendistribusikan beberapa proses mysqld di seluruh CPU. Ini tidak lagi diperlukan, terima kasih kepada Percona, dan kemudian MySQL (eh, Oracle, mengatakan bahwa masih membuat saya muntah), karena mereka telah mengembangkan InnoDB menjadi mesin penyimpanan yang lebih matang yang dapat mengakses inti dengan kesederhanaan tanpa banyak penyetelan. Contoh InnoDB saat ini dapat beroperasi dengan baik di server inti tunggal.