php mysql slow query merujuk kepada merekodkan pernyataan SQL yang berjalan agak perlahan dalam log Menghidupkan log pertanyaan perlahan membolehkan MySQL merekodkan pertanyaan yang melebihi masa yang ditetapkan, ia boleh lebih tepat. Pengoptimuman prestasi sistem pangkalan data yang baik.
Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer DELL G3
Apakah itu php mysql slow pertanyaan?
Pertanyaan lambat MySQL merekodkan pernyataan SQL yang berjalan perlahan dalam log Fungsi ini perlu dihidupkan untuk digunakan.
1. Pengenalan
Menghidupkan log pertanyaan yang perlahan membolehkan MySQL merekodkan pertanyaan yang melebihi masa yang ditetapkan Dengan mencari dan menganalisis kesesakan prestasi, prestasi sistem pangkalan data boleh dioptimumkan dengan lebih baik.
2. Pengenalan parameter
slow_query_log status buka pertanyaan perlahan
slow_query_log_file Lokasi di mana log pertanyaan perlahan disimpan (direktori ini memerlukan kebenaran menulis akaun MySQL yang dijalankan, biasanya ditetapkan kepada direktori storan data MySQL)
long_query_time Berapa saat yang diperlukan oleh pertanyaan sebelum merakam, lalainya ialah 10 saat
3 Dayakan pertanyaan perlahan
(1) Lihat parameter berkaitan pertanyaan perlahan
mysql> show variables like 'slow_query%'; +---------------------------+-----------------------------------+ | Variable_name | Value | +---------------------------+-----------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /usr/local/var/mysql/slow.log | +---------------------------+-----------------------------------+ mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+
(2) Kaedah tetapan
Kaedah 1: Tetapan pembolehubah global
Tetapkan pembolehubah global slow_query_log kepada status "HIDUP"
mysql> set global slow_query_log='ON';
Tetapkan lokasi di mana log pertanyaan perlahan disimpan
mysql> set global slow_query_log_file='/usr/local/var/mysql/slow.log ';
Tetapkan masa pertanyaan perlahan dan rekod pertanyaan jika melebihi 1 saat
mysql> set global long_query_time=1;
Kaedah 2: Tetapan fail konfigurasi
Ubah suai konfigurasi Fail my.cnf, tambah
[mysqld] slow_query_log = ON slow_query_log_file = /usr/local/var/mysql/slow.log long_query_time = 1
di bawah [mysqld] (3) Mulakan semula perkhidmatan MySQL
service mysqld restart
( 4) Analisis log pertanyaan perlahan
Ambil bahagian log pertanyaan perlahan:
# Time: 180918 19:06:21 # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707197 # Query_time: 1.015429 Lock_time: 0.000116 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc; # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707236 # Query_time: 1.021662 Lock_time: 0.000083 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '14433' and app_type = 'YGY' order by binding_time desc;
Di sini anda boleh lihat:
Query_time (masa pertanyaan pertanyaan lambat pernyataan) melebihi set 1s,
Rows_sent (Pertanyaan perlahan mengembalikan rekod) Hanya 1 rekod dikembalikan di sini
Rows_examined (bilangan baris yang diimbas oleh pertanyaan perlahan) 44438 -> dilihat dari sini bahawa masalahnya adalah besar
Sekarang letakkan SQL ini Letakkan pernyataan ke dalam pangkalan data untuk pelaksanaan, dan gunakan EXPLAIN untuk menganalisis rancangan pelaksanaan
EXPLAIN select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc;
Hasil pertanyaan ialah:
Terangkan parameter:
Anda boleh temui di sini: baris ialah bilangan baris yang ditanya dan lebih daripada 40,000 baris telah disoal, jadi ia pasti perlahan.
Oleh kerana terdapat beberapa syarat di sini dan tiada indeks digunakan, kami hanya boleh menambah indeks
Tambah indeks berbilang lajur biasa di sini kerana jadual ini pada mulanya direka Berlaku kesilapan, mengakibatkan. dalam data pendua dan indeks unik tidak boleh ditetapkan.
ALTER TABLE app_mobile_device ADD INDEX user_app_type_only ( `user_id` ,`app_type` )
Indeks telah ditetapkan, mari lihat rancangan pelaksanaan SQL sebentar tadi.
Anda boleh mendapati bahawa bilangan baris yang disemak telah menurun dengan ketara.
Pada ketika ini, penggunaan dan pengoptimuman pertanyaan lambat pada asasnya selesai.
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Apakah pertanyaan lambat php mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!