Manajemen kinerja basis data adalah area di mana bisnis ketika administrator sering menemukan diri mereka berkontribusi lebih banyak waktu daripada yang mereka harapkan.
Memantau dan bereaksi terhadap masalah kinerja basis data produksi adalah salah satu tugas paling penting dalam pekerjaan administrator basis data. Ini adalah proses berkelanjutan yang membutuhkan perawatan konstan. Aplikasi dan basis data yang mendasari biasanya berkembang seiring waktu; bertambah dalam ukuran, jumlah pengguna, beban kerja, perubahan skema yang menyertai perubahan kode.
Kueri yang berjalan lama jarang tak terhindarkan dalam database MySQL. Dalam beberapa keadaan, kueri yang berjalan lama mungkin merupakan peristiwa yang berbahaya. Jika Anda peduli dengan database Anda, mengoptimalkan kinerja kueri, dan mendeteksi kueri yang berjalan lama harus dilakukan secara teratur.
Di blog ini, kita akan melihat lebih mendalam tentang beban kerja database yang sebenarnya, terutama di sisi kueri yang sedang berjalan. Kami akan memeriksa cara melacak kueri, jenis informasi apa yang dapat kami temukan di metadata MySQL, alat apa yang digunakan untuk menganalisis kueri tersebut.
Menangani Kueri yang Berjalan Lama
Mari kita mulai dengan memeriksa Kueri yang berjalan lama. Pertama-tama, kita harus mengetahui sifat kueri, apakah itu diharapkan menjadi kueri yang berjalan lama atau yang berjalan singkat. Beberapa operasi analitik dan batch seharusnya merupakan kueri yang berjalan lama, jadi kami dapat melewatinya untuk saat ini. Juga, tergantung pada ukuran tabel, memodifikasi struktur tabel dengan perintah ALTER dapat menjadi operasi yang berjalan lama (terutama di MySQL Galera Clusters).
- Kunci tabel - Tabel dikunci oleh kunci global atau kunci tabel eksplisit saat kueri mencoba mengaksesnya.
- Kueri tidak efisien - Gunakan kolom yang tidak diindeks saat mencari atau bergabung, sehingga MySQL membutuhkan waktu lebih lama untuk menyesuaikan kondisi.
- Deadlock - Sebuah kueri menunggu untuk mengakses baris yang sama yang dikunci oleh permintaan lain.
- Set data tidak cocok dengan RAM - Jika data set kerja Anda cocok dengan cache itu, maka kueri SELECT biasanya akan relatif cepat.
- Sumber daya perangkat keras yang kurang optimal - Ini bisa berupa disk yang lambat, pembuatan ulang RAID, jaringan jenuh, dll.
Jika Anda melihat kueri membutuhkan waktu lebih lama dari biasanya untuk dieksekusi, lakukan selidiki.
Menggunakan Daftar Proses Tampilkan MySQL
MYSQL> SHOW PROCESSLIST;
Ini biasanya hal pertama yang Anda jalankan jika terjadi masalah kinerja. SHOW PROCESSLIST adalah perintah mysql internal yang menunjukkan kepada Anda utas mana yang sedang berjalan. Anda juga dapat melihat informasi ini dari tabel information_schema.PROCESSLIST atau perintah daftar proses mysqladmin. Jika Anda memiliki hak PROSES, Anda dapat melihat semua utas. Anda dapat melihat informasi seperti Query Id, waktu eksekusi, siapa yang menjalankannya, host klien, dll. Informasi dengan sedikit waspada tergantung pada rasa dan distribusi MySQL (Oracle, MariaDB, Percona)
SHOW PROCESSLIST;
+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+
| 2 | event_scheduler | localhost | NULL | Daemon | 2693 | Waiting on empty queue | NULL | 0.000 |
| 4 | root | localhost | NULL | Query | 0 | Table lock | SHOW PROCESSLIST | 0.000 |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+
kita dapat langsung melihat kueri ofensif langsung dari output. Dalam contoh di atas yang bisa menjadi kunci Tabel. Tapi seberapa sering kita menatap proses itu? Ini hanya berguna jika Anda mengetahui transaksi yang berjalan lama. Jika tidak, Anda tidak akan tahu sampai sesuatu terjadi - seperti koneksi menumpuk, atau server menjadi lebih lambat dari biasanya.
Menggunakan MySQL Pt-query-digest
Jika Anda ingin melihat informasi lebih lanjut tentang beban kerja tertentu, gunakan pt-query-digest. pt-query-digest adalah alat Linux dari Percona untuk menganalisis kueri MySQL. Ini adalah bagian dari Percona Toolkit yang dapat Anda temukan di sini. Ini mendukung distribusi Linux 64 bit paling populer seperti Debian, Ubuntu, dan Redhat.
Untuk menginstalnya, Anda harus mengonfigurasi repositori Percona dan kemudian menginstal paket perona-toolkit.
Instal Percona Toolkit menggunakan manajer paket Anda:
Debian atau Ubuntu:
sudo apt-get install percona-toolkit
RHEL atau CentOS:
sudo yum install percona-toolkit
Pt-query-digest menerima data dari daftar proses, log umum, log biner, log lambat atau tcpdump Selain itu, dimungkinkan untuk melakukan polling daftar proses MySQL pada interval yang ditentukan - sebuah proses yang bisa memakan banyak sumber daya dan jauh dari ideal, tetapi masih dapat digunakan sebagai alternatif.
Sumber paling umum untuk pt-query-digest adalah log kueri yang lambat. Anda dapat mengontrol berapa banyak data yang akan masuk ke sana dengan parameter log_slow_verbosity.
Ada beberapa hal yang dapat menyebabkan kueri membutuhkan waktu lebih lama untuk dieksekusi:
- microtime - kueri dengan presisi mikrodetik.
- query_plan - informasi tentang rencana eksekusi kueri.
- innodb - Statistik InnoDB.
- minimal - Setara dengan mengaktifkan waktu mikro saja.
- standar - Setara dengan mengaktifkan microtime,innodb.
- penuh - Setara dengan semua nilai lain ATAU bersama-sama tanpa opsi pembuatan profil dan pembuatan_penggunaan_getrusage.
- profiling - Mengaktifkan pembuatan profil semua kueri di semua koneksi.
- profiling_use_getrusage - Mengaktifkan penggunaan fungsi getrusage.
sumber:Dokumentasi Percona
Untuk kelengkapan, gunakan log_slow_verbosity=full yang merupakan kasus umum.
Log Kueri Lambat
Log kueri lambat dapat digunakan untuk menemukan kueri yang membutuhkan waktu lama untuk dieksekusi dan oleh karena itu merupakan kandidat untuk pengoptimalan. Log kueri lambat menangkap kueri lambat (pernyataan SQL yang membutuhkan lebih dari long_query_time detik untuk dieksekusi), atau kueri yang tidak menggunakan indeks untuk pencarian (log_queries_not_using_indexes). Fitur ini tidak diaktifkan secara default dan untuk mengaktifkannya cukup atur baris berikut dan mulai ulang server MySQL:
[mysqld]
slow_query_log=1
log_queries_not_using_indexes=1
long_query_time=0.1
Log kueri lambat dapat digunakan untuk menemukan kueri yang membutuhkan waktu lama untuk dieksekusi dan oleh karena itu merupakan kandidat untuk pengoptimalan. Namun, memeriksa log kueri yang panjang dan lambat bisa menjadi tugas yang memakan waktu. Ada alat untuk mengurai file log kueri lambat MySQL dan meringkas isinya seperti mysqldumpslow, pt-query-digest.
Skema Kinerja
Skema Kinerja adalah alat hebat yang tersedia untuk memantau internal Server MySQL dan detail eksekusi di tingkat yang lebih rendah. Itu memiliki reputasi buruk di versi awal (5.6) karena mengaktifkannya sering menyebabkan masalah kinerja, namun versi terbaru tidak merusak kinerja. Tabel berikut dalam Skema Kinerja dapat digunakan untuk menemukan kueri lambat:
- events_statements_current
- events_statements_history
- events_statements_history_long
- events_statements_summary_by_digest
- events_statements_summary_by_user_by_event_name
- events_statements_summary_by_host_by_event_name
MySQL 5.7.7 dan yang lebih tinggi menyertakan skema sistem, kumpulan objek yang membantu DBA dan pengembang menafsirkan data yang dikumpulkan oleh Skema Kinerja ke dalam bentuk yang lebih mudah dipahami. Objek skema sistem dapat digunakan untuk kasus penggunaan penyetelan dan diagnosis yang khas.
Pelacakan jaringan
Bagaimana jika kita tidak memiliki akses ke log kueri atau log aplikasi langsung. Dalam hal ini, kita dapat menggunakan kombinasi tcpdump dan pt-query digest yang dapat membantu menangkap kueri.
$ tcpdump -s 65535 -x -nn -q -tttt -i any port 3306 > mysql.tcp.txt
Setelah proses capture selesai, kita bisa melanjutkan pengolahan datanya:
$ pt-query-digest --limit=100% --type tcpdump mysql.tcp.txt > ptqd_tcp.out
Pemantau Kueri ClusterControl
ClusterControl Query Monitor adalah modul dalam kontrol cluster yang menyediakan informasi gabungan tentang aktivitas database. Itu dapat mengumpulkan informasi dari berbagai sumber seperti menampilkan daftar proses atau log kueri lambat dan menyajikannya dengan cara yang telah dikumpulkan sebelumnya.
Pemantauan SQL dibagi menjadi tiga bagian.
Kueri Teratas
menyajikan informasi tentang kueri yang membutuhkan banyak sumber daya.
Menjalankan Kueri
ini adalah daftar proses informasi yang digabungkan dari semua node cluster database menjadi satu tampilan. Anda dapat menggunakannya untuk mematikan kueri yang memengaruhi operasi basis data Anda.
Pencilan Kueri
menyajikan daftar kueri dengan waktu eksekusi lebih lama dari rata-rata.
Kesimpulan
Ini semua untuk bagian kedua. Blog ini tidak dimaksudkan sebagai panduan lengkap tentang cara meningkatkan kinerja basis data, tetapi diharapkan memberikan gambaran yang lebih jelas tentang hal-hal apa saja yang dapat menjadi penting dan beberapa parameter dasar yang dapat dikonfigurasi. Jangan ragu untuk memberi tahu kami jika kami melewatkan yang penting di komentar di bawah.