Bagaimana cara mengoptimalkan penggunaan memori MySQL?

9

SETUP SAYA ( contoh )

Saya menjalankan Linux pada instance Amazon High CPU Extra Large EC2 dengan spesifikasi berikut:

  • Memori 7 GB
  • 20 Unit Komputasi EC2 (masing-masing 8 inti virtual dengan 2.5 Unit Komputasi EC2)
  • 1690 GB penyimpanan instance lokal
  • Platform 64-bit

Saya memiliki dua database MySQL besar yang berjalan di mesin penyimpanan MyISAM. Satu adalah 2GB dan yang lainnya adalah 500MB. Saya ingin memastikan MySQL menggunakan RAM sebanyak mungkin / perlu untuk memaksimalkan kecepatan permintaan. Saya tahu ada banyak opsi konfigurasi memori MySQL seperti key_buffer_sizedan MyISAM_sort_buffer_size,tapi saya tidak terbiasa dengan mengoptimalkan ini.

PERTANYAAN

  1. Bagaimana cara memeriksa memori apa yang saat ini digunakan MySQL pada sistem Linux?
  2. Bagaimana cara memaksimalkan / mengoptimalkan penggunaan memori MySQL?
  3. Dengan anggapan pertanyaan dan skema saya dioptimalkan, perubahan apa yang harus saya pertimbangkan?
T. Brian Jones
sumber
Anda dapat memeriksa dengan program htop.
neworld
Memaksimalkan penggunaan memori tidak akan seluruh database menjadi memori. Anda harus memiliki sistem file berbasis RAM ...
4
Sistem file berbasis RAM tidak aman. Jika server macet semua data akan hilang
neworld

Jawaban:

7

Ini adalah topik yang sulit. Tidak dapat dijawab di sini, seluruh buku telah ditulis tentang ini. Saya sarankan untuk membuat innodb_buffer_pool_size Anda cukup besar. Jika Anda menggunakan tabel myisam, maka periksa key_buffer_size. Juga table_cache dan max_connections harus dipertimbangkan.

Inilah sesuatu yang dapat membantu Anda:

http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/ http://www.mysqlperformanceblog.com/2007/11/01/innodb- performance-optimization-basics / http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

EDIT:

Seperti yang dikatakan @ drew010 penting untuk mempertimbangkan jenis penggunaan yang dimiliki DB. Penyetelan untuk DB baca yang berat sangat berbeda dari penulisan yang berat. Anda juga dapat mempertimbangkan strategi lain. Seperti Memcached, database nosql, dll.

santiago.basulto
sumber
2
Setuju, mereka adalah database yang cukup kecil juga relatif berbicara. Jika Anda mengharapkan satu ton akses baca basis data, maka Anda dapat mempertimbangkan semacam sistem caching seperti memcached yang dapat digunakan aplikasi Anda untuk menyimpan nilai dari basis data untuk mengurangi hit ke basis data. Jika Anda melakukan sebagian besar menyisipkan, maka disk akan menjadi faktor yang sangat penting. Untuk tingkat tertentu, pertanyaannya tergantung pada apa kasus penggunaan Anda. Jika data tidak banyak berubah, maka cache kueri mysql akan banyak membantu dengan kueri yang lebih cepat. Pastikan juga indeks / kunci utama Anda baik.
drew010
+1 Anda kakak yang benar. Saya kira dia meminta penyetelan dasar, tetapi penting untuk mempertimbangkan penggunaan DB dan hal-hal lain. Sekali lagi, tidak bisa didiskusikan di sini, saya kira.
santiago.basulto
1

Jika Anda perlu memastikan bahwa MySQL menggunakan semua memori yang dibutuhkan, Anda harus beralih ke InnoDB. Kecuali Anda menggunakan FULLTEXTkemampuan pencarian MySQL , tidak akan ada masalah serius.

Dalam kasus MyISAM sejumlah cache digunakan, termasuk buffer kunci MySQL internal dan cache sistem. Jika Anda menginginkan kinerja terbaik, Anda perlu menyisakan ruang untuk salah satu dari cache, tetapi tetap saya tidak merekomendasikan MyISAM untuk tujuan itu terutama jika database Anda terlalu banyak menulis: MyISAM mengunci seluruh tabel pada penulisan, sedangkan InnoDB mengunci hanya baris yang terpengaruh.

Bahkan jika Anda memasukkan semua database Anda ke dalam memori, Anda masih dapat memiliki query yang berjalan lambat karena indeks yang tidak mencukupi atau alasan lain.

sanmai
sumber