Database memainkan peran penting dalam performa aplikasi apa pun. Tidak terkecuali database MySQL. Oleh karena itu, penting untuk memahami berbagai cara penyesuaian, desain, dan konfigurasi database dapat membantu meningkatkan performa aplikasi Anda. Di bawah ini adalah beberapa cara mengoptimalkan MySQL untuk mencapai performa yang optimal.
Penyesuaian kueri
Penyesuaian performa database dimulai dari aplikasi. Cara aplikasi menerjemahkan persyaratan bisnis menjadi kueri database membuat perbedaan besar pada kompleksitas dan efisiensi aplikasi. Ukuran performa yang sebenarnya adalah seberapa efisien setiap instance database berkontribusi terhadap kebutuhan bisnis.
Desain skema
Cara entity dan hubungan ditentukan dalam database relasional menentukan seberapa mudah atau kompleks respons terhadap kueri database. Selain itu, cara penentuan indeks utama dan indeks sekunder juga memainkan peran penting.
Konfigurasi server
Konfigurasi server bertanggung jawab untuk mengoptimalkan dan memaksimalkan pemanfaatan sumber daya sistem. Resource sistem adalah inti unit pemrosesan inti (CPU), memori pada mesin fisik atau virtual machine (VM), sistem penyimpanan yang mendasarinya, dan jaringan.
Penyesuaian server dinamis
Pemantauan, pengoptimalan, dan penyesuaian performa berkelanjutan untuk menyesuaikan workload database untuk dinamika dunia nyata.
Artikel ini berfokus pada penyesuaian kueri. Topik lainnya akan dibahas dalam artikel berikutnya.
Kita sering memulai proses penyesuaian kueri dengan melihat kueri database. Cara yang lebih baik adalah memulai dengan mengevaluasi seberapa efisien persyaratan bisnis telah diterjemahkan menjadi kueri database. Penafsiran dan pemrosesan kebutuhan bisnis menjadi kueri menentukan seberapa kecil atau besar biayanya.
Langkah pertama adalah memprioritaskan kueri yang akan dioptimalkan:
Kedua kategori ini perlu dioptimalkan selama desain skema database.
Transaksi adalah unit logis di mana semua pernyataan yang ada akan di-commit sepenuhnya atau roll back. Transaksi adalah fitur yang menyediakan atomik, konsistensi, isolasi, dan ketahanan (ACID) untuk MySQL.
Di InnoDB, mesin penyimpanan untuk MySQL, semua aktivitas pengguna terjadi di dalam transaksi. Secara default, mode autocommit diaktifkan, yang berarti setiap pernyataan SQL membentuk satu transaksi sendiri. Untuk melakukan transaksi beberapa pernyataan jika autocommit diaktifkan, mulai transaksi secara eksplisit dengan START_TRANSACTION atau START_TRANSACTION dan akhiri dengan START_TRANSACTION atau START_TRANSACTION. Jika mode autocommit dinonaktifkan, sesi selalu memiliki transaksi yang terbuka hingga COMMIT atau COMMIT mengakhirinya dan memulai transaksi baru.
Praktik terbaik dalam melakukan transaksi adalah membuatnya sesingkat mungkin. Karena transaksi yang panjang memiliki beberapa kelemahan seperti yang akan dijelaskan lebih lanjut dalam artikel ini.
1. Pertentangan kunci yang berkepanjangan, yang menyebabkan kueri lebih lambat dan potensi kegagalan kueri
2. Performa server menurun karena banyaknya log yang diurungkan
3. Peningkatan penggunaan disk
4. Waktu penonaktifan yang lebih lama
5. Waktu pemulihan error yang lebih lama
Kueri dapat ditangkap di sisi aplikasi atau sisi database.
Praktik pengembangan yang baik adalah mencatat log kueri database dan waktu eksekusi kueri. Pencatatan sisi aplikasi memudahkan evaluasi efektivitas dan efisiensi kueri dalam konteks bisnis. Misalnya, pengguna mungkin mencatat setiap waktu respons kueri atau mencatat waktu respons untuk fungsi tertentu. Ini juga merupakan cara mudah untuk mendapatkan total waktu eksekusi untuk transaksi multi-pernyataan.
Selain itu, waktu respons kueri yang diukur dari logging sisi aplikasi adalah pengukuran menyeluruh, termasuk waktu jaringan. Hal ini melengkapi waktu eksekusi kueri yang dicatat dari database dan memudahkan identifikasi apakah masalah tersebut berkaitan dengan masalah jaringan atau database.
Insight Kueri MySQL Cloud SQL
Alat Cloud SQL Query Insights memungkinkan penangkapan, pemantauan, dan diagnosis kueri.
Query Insights memudahkan Anda menemukan kueri teratas berdasarkan waktu eksekusi dan frekuensi eksekusi.
Alat ini memiliki opsi pemfilteran seperti rentang waktu, database, akun pengguna, dan alamat klien. Alat ini memiliki grafik untuk menunjukkan penggunaan CPU, dan perincian IO dan waktu tunggu kunci. Tabel “Kueri dan tag teratas” mencantumkan kueri teratas berdasarkan waktu eksekusi dengan kueri yang dinormalisasi. Selain waktu eksekusi, alat ini juga menyertakan statistik tentang "baris rata-rata yang dipindai" dan "baris rata-rata yang ditampilkan" yang memberikan insight tentang efisiensi kueri.
Lihat dokumentasi untuk melihat semua yang ditawarkan dan cara mengaktifkannya.
Menggunakan performance_schema
Di Cloud SQL untuk MySQL, fitur performance_schema diaktifkan secara default untuk MySQL 8.0.26 dan versi yang lebih tinggi dengan memori lebih dari 15 GB. Mengaktifkan atau menonaktifkannya mengharuskan instance dimulai ulang.
Jika performance_schema=ON, instrumen pernyataan kueri diaktifkan secara default. Tabel sys.statement_analysis memberikan statistik gabungan untuk kueri yang dinormalisasi. Bagian ini menjawab pertanyaan seperti:
Jika Anda menggunakan MySQL Workbench, alat itu memiliki laporan skema performa berdasarkan tampilan sistem. Laporan ini memiliki bagian tentang "Pernyataan SQL Biaya Tinggi", yang memberikan insight mengenai performa kueri.
Menggunakan log lambat + alat
Log lambat menangkap semua kueri yang berjalan lebih lama daripada long_query_time. Fungsi ini juga mencatat waktu eksekusi kueri, waktu kunci, baris data yang diperiksa, dan baris data yang dikirim. Statistik eksekusi tambahan menjadikannya kandidat yang lebih disukai untuk menganalisis kueri database daripada menggunakan log umum.
Praktik yang baik adalah mengaktifkan log lambat. Biasanya, long_query_time harus dipertahankan pada batas yang wajar untuk menangkap kueri yang ingin Anda lihat dan optimalkan.
log_output=FILE
slow_query_log=ON
long_query_time=2
Sesekali, sebaiknya tetapkan long_query_time=0 untuk menangkap semua kueri dalam waktu singkat dan mendapatkan ringkasan tentang volume dan performa kueri.
Ada beberapa alat seperti mysqldumpslow dan pt-query-digest, yang akan mengekstrak tanda tangan kueri dan membuat laporan untuk menampilkan statistik kueri.
Ada alat pemantauan pihak ketiga lainnya yang menghasilkan laporan tentang statistik kueri, seperti Percona Monitoring and Management, SolarWinds Database Performance Monitor (sebelumnya VividCortex), dan banyak lagi.
Setelah menangkap kueri dalam transaksi, langkah berikutnya adalah mengoptimalkannya.
Perintah EXPLAIN menyediakan rencana eksekusi kueri dan dari 8.0.18, perintah EXPLAIN ANALYZE akan menjalankan pernyataan dan menghasilkan output EXPLAIN bersama dengan waktu dari eksekusi.
Insight Kueri MySQL menyediakan akses praktis ke paket EXPLAIN.
Apa yang kita cari dalam output-nya?
Variabel status sesi dapat digunakan untuk mendapatkan detail eksekusi kueri.
Pertama, hapus variabel sesi, lalu jalankan kueri dan periksa penghitung. Misalnya, status Handler_* menampilkan pola akses data dan jumlah baris. Created_* akan muncul jika tabel sementara dan/atau tabel sementara pada disk dibuat. Sort_* akan menampilkan jumlah penerusan penggabungan pengurutan dan jumlah baris yang diurutkan. Variabel sesi lainnya dijelaskan dalam dokumentasi.
Pernyataan SHOW PROFILE menyediakan waktu eksekusi kueri pada tahap eksekusi yang juga dapat menjadi informasi yang bermanfaat.
Setelah rencana eksekusi kueri dipahami, ada beberapa cara untuk memengaruhi dan mengoptimalkannya.
Untuk mengoptimalkan konfigurasi server untuk kueri tertentu, sebaiknya gunakan variabel tingkat sesi, bukan mengubah nilai global yang memengaruhi semua sesi.
Nilai sesi yang sering digunakan adalah:
Singkatnya, untuk penyesuaian kueri, kami membahas tiga aspek:
Mulailah membangun solusi di Google Cloud dengan kredit gratis senilai $300 dan lebih dari 20 produk yang selalu gratis.