Bagaimana untuk menganalisis sebab mengapa pertanyaan MySQL lambat

PHPz
Lepaskan: 2023-04-17 17:30:22
asal
1216 orang telah melayarinya

Pertanyaan MySQL adalah perlahan, yang merupakan masalah yang dihadapi oleh ramai pengguna MySQL. Pertanyaan perlahan bukan sahaja menjejaskan prestasi pangkalan data, tetapi juga mempengaruhi pengalaman pengguna. Dalam artikel ini, kami akan mempelajari cara menganalisis sebab pertanyaan MySQL yang perlahan dan menyediakan beberapa penyelesaian.

  1. Memantau log pertanyaan perlahan

Pertama, kita perlu mendayakan fungsi log pertanyaan perlahan MySQL untuk menganalisis sebab pertanyaan lambat. Log pertanyaan perlahan merekodkan masa yang dihabiskan untuk pertanyaan, pernyataan SQL, alamat pelanggan dan maklumat lain yang berkaitan, yang sangat membantu kami dalam menganalisis pertanyaan perlahan.

Untuk mendayakan log pertanyaan perlahan, kami perlu mengubah suai fail konfigurasi MySQL "my.cnf" atau "my.ini" dan menambah kandungan berikut di bawah nod "[mysqld]":

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
Salin selepas log masuk

Antaranya, "slow_query_log" bermaksud menghidupkan log pertanyaan perlahan, dan nilai 1 bermaksud menghidupkannya "slow_query_log_file" menentukan laluan menyimpan log pertanyaan perlahan, yang boleh diubah suai mengikut sebenar. situasi. "long_query_time" bermaksud berapa saat melebihi masa pertanyaan sebelum ia dianggap sebagai pertanyaan perlahan , lalai ialah 10 saat, anda boleh menetapkannya mengikut situasi sebenar. Selepas mengubah suai fail konfigurasi, mulakan semula perkhidmatan MySQL untuk menjadikan fail konfigurasi berkuat kuasa.

  1. Gunakan alatan analisis log pertanyaan perlahan

Selepas mempunyai log pertanyaan perlahan, kita perlu menggunakan beberapa alatan untuk menganalisis log dan mengetahui sebab pertanyaan lambat . Dua alatan analisis log pertanyaan perlahan yang biasa digunakan diperkenalkan di bawah:

2.1 mysqldumpslow

mysqldumpslow ialah alat analisis log pertanyaan lambat MySQL sendiri Ia boleh menganalisis log pertanyaan perlahan mengikut dimensi yang berbeza, seperti masa dan masa. Analisis log pertanyaan perlahan berdasarkan pernyataan pertanyaan, alamat pelanggan, dsb., dan berikan hasil statistik yang sepadan.

Sebelum menggunakan mysqldumpslow untuk analisis, kita perlu memahami beberapa parameter mysqldumpslow:

  • -a: Keluarkan keputusan dalam susunan terbalik masa pertanyaan
  • -s : Tentukan Dimensi pengisihan, parameter yang biasa digunakan ialah: t (isih mengikut masa), al (isih mengikut pernyataan pertanyaan), ar (isih mengikut alamat klien), dsb.
  • -t: Bilangan hasil keluaran

Menggunakan arahan mysqldumpslow memerlukan log pertanyaan perlahan sebagai input Secara amnya, laluan lalai log pertanyaan perlahan ialah "/var/log/mysql/slow-query.log". Berikut ialah contoh:

mysqldumpslow -s t -t 10 /var/log/mysql/slow-query.log
Salin selepas log masuk

Arahan di atas akan mengisih mengikut masa dan mengeluarkan 10 keping data pertama.

2.2 pt-query-digest

pt-query-digest ialah alat analisis log pertanyaan perlahan dalam suite alat Percona Ia bukan sahaja boleh menganalisis log pertanyaan lambat MySQL, tetapi juga menganalisis yang lain Log pertanyaan lambat pangkalan data. Berbanding dengan mysqldumpslow, pt-query-digest menyokong lebih banyak dimensi dan hasil analisis yang lebih tepat.

Sebelum menggunakan pt-query-digest, anda perlu memasang suite alat Percona, dan kemudian jalankan arahan berikut untuk melaksanakan analisis:

pt-query-digest /var/log/mysql/slow-query.log
Salin selepas log masuk

Selepas operasi selesai, pt- query-digest akan memberikan Keputusan statistik yang sepadan adalah output dan boleh diisih mengikut dimensi yang berbeza.

  1. Optimumkan pernyataan pertanyaan

Menganalisis log pertanyaan perlahan boleh mengetahui sebab pertanyaan lambat, tetapi untuk benar-benar menyelesaikan masalah, anda perlu mengoptimumkan pertanyaan kenyataan. Berikut ialah beberapa cara untuk mengoptimumkan pernyataan pertanyaan.

3.1 Tentukan indeks yang sesuai

Indeks adalah kunci untuk mempercepatkan pertanyaan. Indeks membolehkan MySQL mencari baris data dengan lebih pantas. Apabila mereka bentuk jadual, tetapkan indeks yang sesuai mengikut keperluan pertanyaan. Secara umum, kita harus menambah indeks untuk lajur yang kerap muncul dalam klausa WHERE, sambil mengelakkan terlalu banyak indeks kerana indeks mengambil ruang cakera dan menjejaskan prestasi semasa menulis data.

Jika anda tidak dapat menentukan lajur yang perlu diindeks, kami boleh menggunakan perintah EXPLAIN untuk melihat pelan pelaksanaan pertanyaan dan mengetahui tempat pengoptimuman diperlukan. Sebagai contoh, pernyataan pertanyaan SQL berikut:

SELECT * FROM table WHERE name = 'Tom' and age > 18
Salin selepas log masuk

Laksanakan arahan EXPLAIN:

EXPLAIN SELECT * FROM table WHERE name = 'Tom' and age > 18
Salin selepas log masuk

Keputusan berikut diperoleh:

id  select_type table  type  possible_keys  key  key_len  ref  rows  Extra
1   SIMPLE      table  ref   idx_name_age   idx_name_age 123 const      10    Using where
Salin selepas log masuk

Di mana, " type" mewakili pertanyaan Jenis, jenis biasa termasuk: SEMUA (imbasan jadual penuh), indeks (imbasan indeks), dsb.; "kekunci_mungkin" menunjukkan indeks yang boleh digunakan; "kunci" menunjukkan indeks yang sebenarnya digunakan; "Tambahan" menunjukkan maklumat lain, seperti sama ada untuk menggunakan jadual Sementara, dsb. Jika pertanyaan menggunakan imbasan jadual penuh, ini bermakna indeks yang sesuai tidak digunakan.

3.2 Elakkan menggunakan subkueri yang tidak perlu

Subkueri ialah pernyataan pertanyaan bersarang yang memilih data dan ia boleh disarangkan dalam pernyataan pertanyaan lain. Walaupun subkueri boleh menanyakan data yang kompleks dengan mudah, dalam beberapa kes, subkueri mempunyai prestasi rendah dan boleh menyebabkan masalah dengan mudah. Untuk mengelakkan masalah prestasi subkueri, kami boleh menggunakan pertanyaan berkaitan atau jadual sementara untuk menggantikan subkueri, atau mengoptimumkan subkueri.

3.3 Mengambil data atas permintaan

Apabila kita melaksanakan pernyataan pertanyaan SELECT, kadangkala kita tidak perlu menanyakan semua lajur dan baris, tetapi hanya beberapa lajur dan baris. Pada masa ini, kita harus cuba mengambil data atas permintaan dan mendapatkan bilangan baris yang diperlukan melalui klausa LIMIT untuk mengurangkan beban kerja pangkalan data dan jumlah penghantaran data. Contohnya, pernyataan pertanyaan SQL berikut:

SELECT * FROM table WHERE id > 100 ORDER BY id DESC
Salin selepas log masuk

hanya perlu menanyakan rekod dengan ID lebih daripada 100 dan mengisihnya dalam susunan menurun mengikut ID. Jika terdapat banyak rekod dalam jadual, kita boleh menggunakan klausa LIMIT untuk mengehadkan set hasil pertanyaan:

SELECT * FROM table WHERE id > 100 ORDER BY id DESC LIMIT 50
Salin selepas log masuk

以上就是几种优化查询语句的方法,在实际的应用中,我们需要根据具体的情况选择合适的方法。

总结

MySQL 查询慢不仅影响了数据库的性能,还会影响到用户的体验。为了解决查询慢的问题,我们可以使用慢查询日志分析工具,找出问题所在,然后对查询语句进行优化。通过合理地使用索引、避免使用不必要的子查询和按需取数据等方法,可以提高查询的效率,减少查询所花费的时间,让用户获得更好的体验。

Atas ialah kandungan terperinci Bagaimana untuk menganalisis sebab mengapa pertanyaan MySQL lambat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan