Mengoptimalkan pengaturan default InnoDB

8

Saya melihat ke my.ini dan melihat berbagai pengaturan default. Basis data saya berjalan pada satu PC yang berdiri sendiri. Saya ingin mengoptimalkan kinerja InnoDB dan MySQL secara umum untuk kinerja. Tidak ada batasan ruang disk. Pengaturan default mana yang harus saya ubah untuk mengoptimalkan kinerja, keandalan, dan cadangan point-in-time yang lebih baik [ketersediaan tinggi].

Diedit

Saat ini, setiap kali saya menjalankan "Optimize Tables" melalui Maintenance pada MySQL Administrator, itu menunjukkan:

Tabel tidak mendukung optimisasi, malah membuat ulang + menganalisis

di semua tabel. Semua tabel saya adalah InnoDB, tetapi mengapa mereka tidak mendukung Optimize?

RPK
sumber
suntingan itu menjamin pertanyaan yang terpisah, imo. Lihatlah dokumentasi OPTIMIZE TABLE: dev.mysql.com/doc/refman/5.5/en/optimize-table.html InnoDB mendukung perintah, tetapi prosesnya berbeda dari MyISAM
Derek Downey

Jawaban:

11

Cara menyetel InnoDB berpusat di sekitar

  • InnoDB Buffer Pool: Ini cache halaman data dan halaman indeks. Jumlah data dan indeks yang dapat Anda cache bukan fungsi dari batasan ruang disk tetapi fungsi dari memori yang tersedia dan ruang disk saat ini digunakan oleh InnoDB.
  • InnoDB MetaData: Secara default, file ibdata1 biasanya menampung apa saja dan semuanya InnoDB. Itu akan mencakup halaman data, halaman indeks, metadata tabel, data MVCC .

Berikut adalah rumus yang telah saya gunakan selama 5 tahun terakhir untuk menghitung Pool Buffer InnoDB berdasarkan ruang disk yang digunakan oleh data InnoDB dan halaman indeks :

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
  • Gunakan (PILIH 0 Power1024) untuk Bytes
  • Gunakan (PILIH 1 Power1024) untuk KB
  • Gunakan (PILIH 2 Power1024) untuk MB
  • Gunakan (PILIH 3 Power1024) untuk GB
  • Gunakan (PILIH 4 Power1024) untuk TB (Kirimi Saya email jika Anda memiliki TerraBytes of RAM)

Tentu saja, saya mengatakan fungsi memori dan ruang disk yang tersedia saat ini digunakan oleh InnoDB. Dari sini, cukup gunakan akal sehat. Nomor yang disarankan dari kueri di atas TIDAK HARUS MENGECUALI 75% RAM DIINSTAL !!! Itu adalah aturan praktis yang paling sederhana untuk menentukan ukuran Pool Buffer InnoDB.

Anda juga harus mengatur innodb_flush_method ke O_DIRECT karena akan memberikan penulisan sinkron yang stabil dari InnoDB. Saya juga menulis posting tentang cara mengoptimalkan Disk Storage untuk InnoDB .

Sehubungan dengan pesan Tabel tidak mendukung optimisasi, lakukan membuat ulang + menganalisis sebagai gantinya , alasan mengapa Anda mendapatkan pesan kesalahan adalah kenyataan bahwa mesin penyimpanan adalah InnoDB. Secara mekanis, OPTIMASI TABEL hanya menyalin tabel ke tabel temp dan melakukan TABEL ANALISIS .

Pada kenyataannya, ANALYZE TABLE terhadap InnoDB sama sekali tidak berguna. Bahkan jika Anda menjalankan ANALYZE TABLE pada tabel InnoDB, mesin penyimpanan InnoDB melakukan penyelaman ke dalam indeks untuk perkiraan kardinalitas berulang-ulang, sehingga menghancurkan statistik yang baru saja Anda kompilasi. Bahkan, Percona melakukan beberapa tes pada ANALYZE TABLE dan sampai pada kesimpulan yang sama juga .

Berikut adalah posting lain yang telah saya buat selama setahun tentang InnoDB Tuning

RolandoMySQLDBA
sumber
PC saya memiliki RAM 2GB dan InnoDB_Buffer_Pool_Size secara default diatur ke 6M. Saya telah meningkatkannya menjadi 500 juta. Ada saran?
RPK
Setel 1536M yang merupakan 1,5G karena itu adalah 75% dari RAM yang dipasang
RolandoMySQLDBA
Saya menjalankan kueri Anda, dan memberikan hasil 45G. RAM di server saya adalah 8G .. Apakah saya benar-benar harus meningkatkan RAM? Atau ada beberapa kondisi untuk permintaan di atas ..
Stewie
@Stewie Jika Anda memiliki 45G InnoDB, 60GB RAM adalah apa yang Anda butuhkan jika Anda memiliki anggaran. Karena Anda hanya memiliki 8G, 75% RAM yang terpasang (6G) memadai.
RolandoMySQLDBA
@RolandoMySQLDBA: posting hebat! Tetapi saya tidak begitu mengerti mengapa dalam kasus Stewie, RAM-nya hanya 8 GB tetapi output dari query-nya bisa lebih besar dari 8GB (45G dalam hal ini.) Bisakah Anda mencerahkan?
Chubaka
3

Berikut ini adalah artikel yang lebih lama tentang variabel penting untuk 'nada kasar'. Yang paling penting mungkin adalahinnodb_buffer_pool_size

Saya akan sangat menyarankan untuk meningkatkan ke MySQL 5.5 (jika Anda belum menjalankannya). Mereka membuat beberapa perubahan pada kinerja InnoDB. Mereka bahkan menyediakan bagian utama tentang cara mengoptimalkan untuk InnoDB sekarang karena itu adalah mesin default: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

Adapun cadangan point-in-time, Anda akan ingin melihat log biner . Dasar-dasar mengaktifkan ini adalah untuk mengatur log-binvariabel di my.cnf Anda

Derek Downey
sumber
Saya telah meningkatkan ke MySQL 5.5.
RPK
2

Optimalkan hadir dalam banyak warna.

Saya pikir langkah pertama Anda harus memutuskan apa arti "mengoptimalkan" bagi Anda. Bagi sebagian orang, ini berarti "kueri SELECT tercepat". Bagi yang lain itu berarti "keseimbangan terbaik antara kinerja SELECT dan kinerja INSERT". Untuk yang lain lagi, "kinerja INSERT tercepat".

Anda perlu memutuskan apa kriteria Anda dan bagaimana Anda akan tahu apakah perubahan Anda membantu sebelumnya Anda mulai menyetel.

Kemudian letakkan file konfigurasi dan opsi mulai di bawah kontrol versi, dan mulailah bereksperimen. Dokumentasikan saran siapa yang Anda ikuti, dan di mana Anda menemukannya. (Saran berubah seiring waktu, karena basis kode dan perangkat keras berubah.) Letakkan juga dokumen-dokumen itu di bawah kontrol versi.

Mike Sherrill 'Cat Recall'
sumber