Opsi konfigurasi apa untuk MySQL yang memberikan peningkatan kecepatan terbesar?

29

Opsi konfigurasi apa untuk MySQL yang memberikan peningkatan kecepatan terbesar?

Saya bertanya-tanya tentang perbaikan file konfigurasi aktual, tipe tabel, pengaturan perangkat keras, replikasi, dll. Apa pun selain struktur kueri dan struktur tabel (ini mudah ditemukan di situs web dan Stack Overflow). Apakah hal-hal seperti pengaturan cache permintaan yang memberi Anda kecepatan tertinggi? Bagaimana dengan drive; apakah lebih baik memilikinya di RAID eksternal atau internal? Apakah replikasi memberi Anda kinerja yang lebih baik, terutama dengan kueri yang banyak dibaca?

Apa pengaturan / perubahan lain yang telah Anda buat untuk meningkatkan kinerja MySQL?

Catatan: Saya menyadari ini sangat bergantung pada penggunaan (yaitu, situs web kecil vs gudang data), tetapi karena saya pikir sebagian besar dari kita mungkin bekerja pada berbagai situs / sistem, ada baiknya mengetahui berbagai teknik yang dapat diterapkan pada berbagai situasi. Juga, saya pikir beberapa teknik dapat ditransfer antar situasi.

Darryl Hein
sumber
Tidak sepenuhnya terkait, tetapi Anda harus menggunakan InnoDB untuk master. Anda dapat mereplikasi ke budak MyISAM dan menggunakan pencarian teks lengkap bawaan mereka yang dapat membuat pencarian teks lebih cepat daripada LIKE
Neil McGuigan

Jawaban:

20

Inilah rekomendasi saya (hasil Anda mungkin berbeda)

  • Gunakan RAID perangkat keras. Ini bertentangan dengan rekomendasi saya untuk menggunakan RAID perangkat lunak di pos lain, namun ini adalah situasi khusus di mana Anda menginginkan kartu RAID perangkat keras. Khususnya Anda ingin NVRAM yang didukung baterai pada kartu RAID untuk mengurangi waktu mengambil fsync file log ke disk.
  • Gunakan HANYA RAID 1 atau RAID 10 volume. Biaya RAID 5 atau 6 tulis terlalu tinggi untuk ditoleransi dalam beban kerja baca / tulis campuran.
  • Gunakan LUN terpisah untuk volume data, log dan tmp. Ini semua harus terpisah dari OS dan volume swap.
  • Gunakan InnoDB .
  • Gunakan innodb_file_per_table
  • Gunakan OS 64-bit
  • Tetapkan kumpulan buffer InnoDB Anda hingga ~ 80% dari RAM yang tersedia
  • Atur file log Anda menjadi 1/4 ukuran buffer pool Anda, Anda antara 2 hingga 4 file log. File log yang lebih besar berarti waktu shutdown dan pemulihan yang lebih lambat, tetapi memungkinkan Anda untuk memulihkan dump database besar lebih cepat.
  • log_slow_queries, log-queries-not-using-indexes, set-variable = long_query_time = 1, selidiki setiap kueri dalam log itu, perbaiki skema Anda untuk menghindari pemindaian tabel dan tabel tmp bila memungkinkan.
Dave Cheney
sumber
11

Sekali lagi Dave Cheney benar-benar menjatuhkannya dari taman di sini. Saya benar-benar tidak bisa menambahkan apa pun pada jawabannya untuk pertanyaan Anda. Namun, saya ingin menunjukkan apa yang tidak Anda tanyakan. Seperti yang diajarkan Jeremy Zawodny dan Peter Zaitsev kepada saya bertahun-tahun yang lalu, ROI Anda untuk melacak waktu yang dihabiskan dan mengoptimalkan kueri yang buruk akan membuat ROI Anda untuk waktu yang dihabiskan membuat perubahan konfigurasi 10 kali lipat. Tentu, Anda tidak ingin memiliki konfigurasi yang buruk, pengaturan RAID yang salah, atau RAM tidak cukup. Tetapi, di antara yang sangat baik, dan bahkan marginal, pertanyaan buruk DBBA MySQL (biasanya dari pengembang / kerangka kerja, bukan DBA) adalah kondisi kronis , di mana konfigurasi yang buruk adalah yang tahan lama .

(Saya menggali kata sifat itu untuk sementara waktu dan masih tidak senang dengan kata sifat yang saya pilih.)

Saya ingin menekankan lagi bahwa jika pengembang Anda menggunakan ORM seperti yang umum dalam kerangka kerja seperti Ruby on Rails dan Django, Anda BENAR-BENAR HARUS memonitor pertanyaan yang mengenai DB Anda. Ketika pengembang berhenti berpikir tentang SQL dan membiarkan DB diabstraksi, benar-benar menjijikkan masuk ini. Saya suka dua kerangka kerja yang baru saja saya sebutkan. (Jangan pilih saya karena mulutnya buruk.) Itu hanya membuat Query Sleuthing sangat penting. (Baca: Keamanan Kerja)

Bruno Bronosky
sumber
4

Beberapa hal lain (yang belum disebutkan dalam jawaban Dave Cheney)

  • Coba atur innodb_flush_method ke O_DIRECT untuk menghindari buffering ganda data. Hindari ini jika kartu RAID Anda tidak memiliki cache tulis yang didukung baterai atau data Anda ada di SAN.

  • Juga mainkan dengan innodb_thread_concurrency. Saya percaya defaultnya adalah 8 tetapi perlu mengubah ini untuk melihat apakah itu meningkatkan kinerja

  • Pastikan cache kueri dihidupkan dan periksa statistik untuk melihat berapa hit rate-nya. Jika bagus, coba tingkatkan untuk melihat apakah itu meningkatkan hit rate.

  • Bergantung pada aplikasi yang dijalankan, Anda mungkin dapat mengubah level isolasi standar. Standarnya adalah REPEATABLE_READ tetapi READ_COMMITTED mungkin memberi Anda kinerja yang lebih baik

  • Jika pernyataan Anda sebagian besar adalah UPDATE dan DELETE maka Anda bisa mencoba men-primkan cache pada slave dengan melakukan kueri SELECT yang mengembalikan set hasil yang akan dimodifikasi. Lihatlah alat mk-slave-prefetch yang akan melakukan ini untuk Anda

  • Lihatlah mesin penyimpanan lain selain dari MyISAM dan InnoDB

Nathan
sumber
1

Hal umum pertama yang harus Anda lakukan adalah melihat parameter memori. Pengaturan default untuk MySQL sangat sangat konservatif. Mesin apa pun yang Anda gunakan, Anda mungkin perlu menaikkan beberapa parameter memori hingga sepuluh atau bahkan seratus kali lipat.

Hal selanjutnya yang harus Anda lakukan adalah melihat cache tabel. Nilai default adalah 64, yang hanya berguna jika Anda memiliki tidak lebih dari sekitar 60 tabel. Anda akan ingin meningkatkan itu jauh.

Hal ketiga yang harus Anda lakukan adalah melihat parameter thread dan koneksi. Wait_timeout default sangat panjang untuk sebagian besar aplikasi berbasis web dan dapat dikurangi menjadi sekitar 30 detik. Ini akan meningkatkan penggunaan memori juga, karena MySQL akan menuai koneksi lebih cepat, meninggalkan lebih sedikit berbaring dalam keadaan 'tidur'.

ahli statika
sumber