MySQL ve MariaDB’de Yavaş Sorgu Günlüğü Nasıl Etkinleştirilir
Yavaş sorgu günlüğü, yürütme süresi yapılandırılabilir bir eşiği aşan her SQL ifadesini kaydeden, MySQL ve MariaDB’ye yerleşik bir tanılama özelliğidir. Sorgu süresini, kilit süresini, incelenen satırları, gönderilen satırları ve tam SQL metnini yakalar; veritabanı yöneticilerine ve geliştiricilere uygulama performansını düşüren her sorgunun dosya tabanlı kesin bir denetim kaydını sunar.
Bu özelliği etkinleştirmek, veritabanı performans ayarlaması sırasında yapabileceğiniz en yüksek etkili işlemlerden biridir. Genel izleme araçlarının aksine, yavaş sorgu günlüğü gecikmeye neden olan tam ifadeleri tespit eder; bu da onu tek kiracılı bir VPS Hosting ortamından çok düğümlü özel veritabanı kümesine kadar her sunucuda dizin optimizasyonu, sorgu yeniden yapılandırması ve kapasite planlaması için vazgeçilmez kılar.
Yavaş Sorgu Günlüğünün Temel İzlemenin Ötesindeki Önemi
Çoğu ekip, kullanıcılar yavaşlık bildirdikten sonra tepkisel olarak EXPLAIN veya SHOW PROCESSLIST kullanmaya başlar. Yavaş sorgu günlüğü proaktif çalışır: gerçek trafiğin saatler veya günler boyunca kanıtını biriktirir ve manuel inceleme penceresinde hiç görünmeyen aralıklı sorunları yakalar.
Temel operasyonel faydalar şunlardır:
- Darboğaz tespiti —
Query_timeileLock_timeoranlarını kullanarak CPU’ya bağlı tam tablo taramalarını kilit çakışması sorunlarından ayırt eder - Dizin boşluğu analizi —
log_queries_not_using_indexesbayrağı, ham yürütme süresinden bağımsız olarak tam tarama gerçekleştiren her sorguyu ortaya çıkarır - Regresyon tespiti — bir dağıtımdan önce ve sonra günlük anlık görüntülerini karşılaştırmak, yeni kodun daha yavaş sorgu kalıpları getirip getirmediğini ortaya koyar
- Kapasite planlama kanıtı —
Rows_examineddeğerlerininRows_sent‘den büyüklük sırası kadar yüksek olması, yük altında katlanarak artan eksik veya yanlış kullanılan dizinlere işaret eder
MySQL ile MariaDB: Yavaş Sorgu Günlüğü Özellik Karşılaştırması
Her iki motor da MySQL 5.1’den miras alınan aynı temel yavaş sorgu günlüğü altyapısını paylaşır; ancak MariaDB bunu birçok anlamlı şekilde genişletmiştir.
| Özellik | MySQL 8.0+ | MariaDB 10.6+ |
|---|---|---|
| — | — | — |
| Temel yavaş sorgu günlüğü | Evet | Evet |
| `long_query_time` hassasiyeti | Mikrosaniye | Mikrosaniye |
| `log_queries_not_using_indexes` | Evet | Evet |
| `log_slow_admin_statements` | Evet | Evet |
| `log_slow_slave_statements` | Evet | Evet (ayrıca replica) |
| `min_examined_row_limit` | Evet | Evet |
| `log_slow_verbosity` (genişletilmiş istatistikler) | Hayır | Evet (sorgu planı, explain) |
| `log_slow_rate_limit` (örnekleme) | Hayır | Evet |
| `log_slow_filter` (sorgu türü başına) | Hayır | Evet |
| `slow_query_log_always_write_time` | Hayır | Evet |
| `pt-query-digest` uyumluluğu | Tam | Tam |
| JSON çıktı biçimi | Evet (8.0.14+) | Hayır (metin kullanır) |
MariaDB’deki log_slow_verbosity ve log_slow_rate_limit seçenekleri, her yavaş sorgunun günlüğe kaydedilmesinin kendi başına bir performans yüküne dönüşebileceği yüksek verimli üretim ortamlarında özellikle değerlidir.
Adım 1: Yapılandırma Dosyasını Bulun
MySQL ve MariaDB, dağıtıma ve kurulum yöntemine bağlı olarak farklı varsayılan yollardan yapılandırmalarını okur.
MySQL:
/etc/my.cnf(RPM tabanlı: RHEL, CentOS, AlmaLinux, Rocky Linux)/etc/mysql/my.cnf(Debian/Ubuntu)/etc/mysql/mysql.conf.d/mysqld.cnf(mysql-serverpaketiyle Ubuntu)
MariaDB:
/etc/my.cnf.d/server.cnf(RPM tabanlı)/etc/mysql/mariadb.conf.d/50-server.cnf(Debian/Ubuntu)/etc/mysql/mariadb.cnf(eski Debian düzenleri)
Hangi dosyanın etkin olduğundan emin değilseniz, çalışan işlemi sorgulayın:
mysqld --verbose --help 2>/dev/null | grep -A1 "Default options"Bu, daemon’ın başlangıçta okuduğu dosyaların tam sıralı listesini yazdırır; herhangi bir !includedir dizini de dahil olmak üzere.
Birincil yapılandırma dosyasını tercih ettiğiniz düzenleyiciyle açın:
sudo nano /etc/my.cnfAdım 2: [mysqld]‘a Yavaş Sorgu Günlüğü Yönergelerini Ekleyin
Tüm yavaş sorgu günlüğü parametreleri [mysqld] bölümüne aittir. Bölüm mevcut değilse, dosyanın başında oluşturun.
[mysqld]
# Core slow query log settings
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 1
# Log queries that skip index usage entirely
log_queries_not_using_indexes = 1
# Avoid flooding the log with index warnings on low-traffic tables
min_examined_row_limit = 100
# Log slow administrative statements (ALTER TABLE, OPTIMIZE TABLE, etc.)
log_slow_admin_statements = 1Parametre açıklaması:
slow_query_log = 1— özelliği etkinleştirir; bloğu kaldırmadan devre dışı bırakmak için0olarak ayarlayınslow_query_log_file— günlük dosyasının mutlak yolu; MySQL/MariaDB işlem kullanıcısının (mysql) üst dizine yazma erişimi olmalıdırlong_query_time = 1— saniye cinsinden eşik, ondalık değerleri kabul eder (örn. 500 ms için0.5); varsayılan 10 saniye web uygulamaları için neredeyse her zaman çok izin vericidirlog_queries_not_using_indexes—long_query_time‘dan bağımsız olarak tam tarama sorgularını günlüğe kaydeder; küçük tablolardan gelen gürültüyü bastırmak içinmin_examined_row_limitile birleştirinmin_examined_row_limit— bir sorgununlog_queries_not_using_indexeskapsamında günlüğe kaydedilmesi için en az bu kadar satırı incelemiş olması gerekir; önemsiz tek satırlık aramaların günlüğü kirletmesini önlerlog_slow_admin_statements— tabloları kilitleyen ve gecikme kaynağı olarak sıklıkla gözden kaçan şema düzeyindeki işlemleri yakalar
Üretimde etkinleştirmeye değer MariaDB’ye özgü eklemeler:
# MariaDB only — extended per-query statistics in the log
log_slow_verbosity = query_plan,explain
# MariaDB only — log only 1 in every N qualifying queries (rate limiting)
log_slow_rate_limit = 10log_slow_verbosity = query_plan,explain, optimize edicinin yürütme planını doğrudan her günlük girişine ekler; bu sayede üretim yük kalıpları altında yalnızca görünen sorguları tanılarken EXPLAIN‘ı manuel olarak yeniden çalıştırma ihtiyacını ortadan kaldırır — önemli bir zaman tasarrufu sağlar.
Adım 3: Günlük Dosyasını Oluşturun ve İzinleri Ayarlayın
Hedef dizin mevcut değilse, servisi yeniden başlatmadan önce oluşturun ve sahipliği atayın. Bu adımı atlamak, yavaş sorgu günlüğünün sessizce etkinleşmemesinin en yaygın nedenlerinden biridir.
sudo mkdir -p /var/log/mysql
sudo touch /var/log/mysql/slow-query.log
sudo chown mysql:mysql /var/log/mysql/slow-query.log
sudo chmod 640 /var/log/mysql/slow-query.logSELinux zorunlu sistemlerde (RHEL, CentOS, AlmaLinux), dosya bağlamının da doğru şekilde ayarlanması gerekir:
sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?"
sudo restorecon -Rv /var/log/mysqlDoğru SELinux bağlamının ayarlanmaması, daemon’ın başarıyla başlamasına ancak günlük dosyasına yazmayı sessizce atlamasına neden olur — /var/log/messages‘da belirgin bir hata üretmeyen sinir bozucu bir uç durum.
Adım 4: Veritabanı Servisini Yeniden Başlatın
Yapılandırma değişikliklerini servis yeniden başlatılarak uygulayın. Modern herhangi bir Linux sunucusunda standart olan systemd tabanlı dağıtımlarda:
# MySQL
sudo systemctl restart mysqld
# MariaDB
sudo systemctl restart mariadbEski init.d tabanlı sistemlerde:
# MySQL
sudo service mysqld restart
# MariaDB
sudo service mariadb restartYeniden başlatmanın ardından servisin düzgün şekilde başladığını kontrol edin:
sudo systemctl status mysqld # or mariadb
sudo journalctl -u mysqld -n 50 --no-pagermy.cnf‘daki herhangi bir yanlış yapılandırma başlatmayı engeller ve journal çıktısında görünür.
Adım 5: Yeniden Başlatma Olmadan Çalışma Zamanında Yavaş Sorgu Günlüğünü Etkinleştirin
Yeniden başlatmanın kesintiye yol açtığı üretim sunucularında, MySQL ve MariaDB SET GLOBAL aracılığıyla yavaş sorgu günlüğünün dinamik olarak etkinleştirilmesini destekler. Bu şekilde yapılan değişiklikler hemen geçerli olur ancak my.cnf‘a da yazılmadıkça servis yeniden başlatmalarında kalıcı olmaz.
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-query.log';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 1;
SET GLOBAL min_examined_row_limit = 100;Bu, canlı bir sistemde acil tanılama için doğru yaklaşımdır — etkinleştirin, yoğun trafik sırasında 15–30 dakikalık bir örnek alın, ardından yapılandırma dosyasına dokunmadan veya daemon’ı yeniden başlatmadan devre dışı bırakın.
Adım 6: Yapılandırmayı Doğrulayın
MySQL veya MariaDB istemcisine bağlanın:
mysql -u root -pArdından sistem değişkeni tablosuna karşı bir kalıp eşleşmesi çalıştırın:
SHOW VARIABLES LIKE '%slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';Doğru yapılandırılmış bir örnek için beklenen çıktı:
+-------------------------------+-------------------------------+
| Variable_name | Value |
+-------------------------------+-------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/slow-query.log |
+-------------------------------+-------------------------------+
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 1.000 |
+-----------------+-------+
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON |
+-------------------------------+-------+Yavaş sorgu sayacını kontrol ederek günlüğün yazıldığını da doğrulayabilirsiniz:
SHOW GLOBAL STATUS LIKE 'Slow_queries';Bu sayaç, dosya günlüğünün etkin olup olmadığından bağımsız olarak bir sorgu long_query_time‘ı her aştığında artar — boş bir günlük dosyasını analiz etmek için zaman harcamadan önce yavaş sorguların gerçekten gerçekleştiğini doğrulamak için kullanışlıdır.
Adım 7: Ham Günlüğü Okuma ve Yorumlama
Yük testi veya yoğun trafik penceresi sırasında günlüğü gerçek zamanlı izlemek için tail kullanın:
sudo tail -f /var/log/mysql/slow-query.logTipik bir günlük girişi şöyle görünür:
# Time: 2024-10-11T12:45:23.489187Z
# User@Host: app_user[app_user] @ 10.0.1.45 [] Id: 1042
# Query_time: 4.561529 Lock_time: 0.000115 Rows_sent: 1 Rows_examined: 847293
# Bytes_sent: 512
SET timestamp=1697030723;
SELECT * FROM orders WHERE customer_email = 'user@example.com' ORDER BY created_at DESC;Her alanın size söyledikleri:
Query_time— saniye cinsinden toplam duvar saati yürütme süresiLock_time— tablo veya satır kilitlerini beklemek için harcanan süre;Lock_time‘ınQuery_time‘a yüksek oranı, eksik bir dizine değil çakışmaya işaret ederRows_sent— istemciye döndürülen satırlarRows_examined— depolama motorunun sonucu üretmek için taradığı satırlar;Rows_examined / Rows_sentoranının 100:1’in üzerinde olması, eksik veya düşük seçici bir dizinin güçlü bir sinyalidirBytes_sent— MariaDB genişletilmiş ayrıntı düzeyinde mevcuttur; gereksiz yere büyük sonuç kümeleri döndüren sorguları tanımlamak için kullanışlıdır
Yukarıdaki örnekte, sorgu 1 satır döndürmek için 847.293 satırı inceledi. customer_email üzerine bir dizin eklemek, Rows_examined‘ı yaklaşık 1’e indirecek ve yürütme süresini 4,5 saniyeden milisaniyenin altına düşürecektir.
Adım 8: Günlüğü mysqldumpslow ve pt-query-digest ile Analiz Edin
Ham günlük dosyasını ölçekte okumak pratik değildir. İki araç, yavaş sorguları toplam etkiye göre toplar ve sıralar.
mysqldumpslow Kullanımı (MySQL/MariaDB ile Birlikte Gelir)
# Top 10 queries by total execution time
sudo mysqldumpslow -s t -t 10 /var/log/mysql/slow-query.log
# Top 10 queries by average execution time
sudo mysqldumpslow -s at -t 10 /var/log/mysql/slow-query.log
# Top 10 queries by rows examined
sudo mysqldumpslow -s r -t 10 /var/log/mysql/slow-query.logmysqldumpslow, sorgu parametrelerini normalleştirir (değişmez değerleri N veya S ile değiştirir); böylece farklı parametre değerlerine sahip yapısal olarak özdeş sorgular bir arada gruplandırılır — yüksek frekanslı kalıpları tanımlamak için gereklidir.
pt-query-digest Kullanımı (Percona Toolkit — Üretim için Önerilir)
# Install Percona Toolkit (Debian/Ubuntu)
sudo apt-get install percona-toolkit
# Install Percona Toolkit (RHEL/CentOS/AlmaLinux)
sudo yum install percona-toolkit
# Generate a full digest report
sudo pt-query-digest /var/log/mysql/slow-query.log
# Show only the top 5 queries by total time
sudo pt-query-digest --limit 5 /var/log/mysql/slow-query.log
# Output to a file for later review
sudo pt-query-digest /var/log/mysql/slow-query.log > /tmp/slow_query_report.txtpt-query-digest, her sorgunun parmak izini, toplam yürütme süresini, ortalama süreyi, çağrı sayısını ve yüzdelik dağılımını gösteren sıralı bir rapor üretir. mysqldumpslow‘dan önemli ölçüde daha güçlüdür ve profesyonel DBA’ların yavaş günlük analizi için kullandığı standart araçtır.
Adım 9: logrotate ile Günlük Rotasyonunu Yapılandırın
Rotasyon olmadan, yavaş sorgu günlüğü süresiz olarak büyür. long_query_time 1 saniyeye ayarlanmış yoğun bir sunucuda, dosya günler içinde birkaç gigabayta ulaşabilir.
Özel bir logrotate yapılandırması oluşturun:
sudo nano /etc/logrotate.d/mysql-slow/var/log/mysql/slow-query.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/bin/mysqladmin flush-logs 2>/dev/null || true
endscript
}Temel yönergeler açıklandı:
rotate 14— 14 günlük sıkıştırılmış arşivi saklar; disk bütçenize ve denetim gereksinimlerinize göre ayarlayıncompress/delaycompress— döndürülen dosyaları gzip ile sıkıştırır, ancak daemon’ın hâlâ açık tutabileceği bir dosyayı sıkıştırmaktan kaçınmak için sıkıştırmayı bir döngü geciktirirpostrotate— rotasyonun ardındanmysqladmin flush-logsçalıştırır; bu, daemon’a mevcut günlük dosyası tanıtıcısını kapatıp yeni bir tane açması için sinyal verir; bu olmadan MySQL/MariaDB bir sonraki yeniden başlatmaya kadar yeniden adlandırılan dosyaya yazmaya devam eder
Yapılandırmayı test etmek için manuel rotasyonu zorlayın:
sudo logrotate -f /etc/logrotate.d/mysql-slowAdım 10: Artık Gerekli Olmadığında Yavaş Sorgu Günlüğünü Devre Dışı Bırakın
Yüksek trafikli bir sunucuda düşük eşikle (örn. 0,5 saniye) sürekli yavaş sorgu günlüğü kaydı ölçülebilir I/O yüküne neden olur. Yeterli veri topladıktan sonra devre dışı bırakın:
Yapılandırma dosyası aracılığıyla (kalıcı):
[mysqld]
slow_query_log = 0Ardından servisi yeniden başlatın:
sudo systemctl restart mysqld # or mariadbÇalışma zamanı değişkeni aracılığıyla (anlık, kalıcı olmayan):
SET GLOBAL slow_query_log = 'OFF';Çalışma zamanı yöntemi üretim saatlerinde tercih edilir — sıfır kesinti süresiyle milisaniyeler içinde geçerli olur.
Gelişmiş: performance_schema‘ı Tamamlayıcı Olarak Kullanma
Yavaş sorgu günlüğü, bir zaman eşiğini aşan sorguları yakalar. performance_schema events_statements_summary_by_digest tablosu, yürütme süresinden bağımsız olarak her farklı sorgu kalıbı için toplu istatistikleri yakalar. Her ikisini birlikte kullanmak tam bir tablo sunar.
SELECT
DIGEST_TEXT,
COUNT_STAR,
ROUND(SUM_TIMER_WAIT / 1e12, 3) AS total_time_sec,
ROUND(AVG_TIMER_WAIT / 1e12, 6) AS avg_time_sec,
SUM_ROWS_EXAMINED,
SUM_ROWS_SENT
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;Bu sorgu, tüm ifade geçmişindeki en fazla zaman tüketen ilk 10 sorgu kalıbını ortaya çıkarır — yavaş sorgu günlüğünün hiçbir zaman yakalayamayacağı, milyonlarca kez çalışan ve toplu olarak CPU süresine hâkim olan hızlı sorgular da dahil olmak üzere.
Hosting Ortamı Değerlendirmeleri
Optimal long_query_time eşiği, sunucunun rolüne ve kaynak profiline büyük ölçüde bağlıdır:
- Paylaşımlı hosting ortamları — genellikle
my.cnf‘a doğrudan erişim yoktur; hosting sağlayıcısıSUPERveyaSYSTEM_VARIABLES_ADMINyetkisi veriyorsaSET GLOBALkullanın ya da kontrol paneli aracılığıyla yavaş günlük erişimi talep edin - VPS ortamları — tam root erişimi tüm yapılandırma parametreleri üzerinde tam kontrol sağlar; cPanel ile VPS kurulumu, doğrudan
my.cnf‘a yazan WHM’nin MySQL Yapılandırma Düzenleyicisi aracılığıyla yavaş sorgu günlüğü ayarlarını ortaya çıkarır - Özel sunucular — yüksek trafikli bir veritabanı çalıştıran bir Özel Sunucu‘da
long_query_time‘ı0.1saniye kadar düşük ayarlamayı ve günlük hacmini kontrol etmek içinlog_slow_rate_limit(MariaDB) veya uygulama düzeyinde örnekleme kullanmayı düşünün - GPU hızlandırmalı analitik iş yükleri — büyük veri kümelerine karşı analitik sorgular çalıştıran GPU Hosting düğümlerinde, uzun süreli analitik sorgular bir kusur değil beklenen davranış olduğundan 5–10 saniyelik bir eşik uygun olabilir
Uygulama yığınınız bir VPS Kontrol Paneli aracılığıyla yönetilen bir web ön ucu içeriyorsa, yavaş sorgu günlüğü zaman damgalarını uygulamanızın HTTP erişim günlüğü zaman damgalarıyla ilişkilendirmek, veritabanı gecikmesini belirli kullanıcı odaklı isteklere kadar izlemek için etkili bir yöntemdir.
Pratik Karar Matrisi: Doğru Eşiği Seçme
| Ortam | Önerilen `long_query_time` | `log_queries_not_using_indexes` | Notlar |
|---|---|---|---|
| — | — | — | — |
| Geliştirme / hazırlık | 0,1 – 0,5 s | AÇIK | Regresyonları erken yakalayın; günlük hacmi kabul edilebilir |
| Düşük trafikli üretim | 1,0 s | `min_examined_row_limit = 500` ile AÇIK | Aşırı I/O olmadan dengeli kapsam |
| Yüksek trafikli üretim | 0,5 – 1,0 s | `log_slow_rate_limit = 10` ile AÇIK (MariaDB) | Disk I/O’yu yönetmek için hız sınırı uygulayın |
| OLAP / raporlama sunucusu | 5,0 – 10,0 s | KAPALI | Uzun sorgular beklenen davranıştır; aykırı değerlere odaklanın |
| Paylaşımlı hosting (sınırlı erişim) | 2,0 s (sağlayıcı varsayılanı) | Sağlayıcıya bağlı | Alternatif olarak `performance_schema` kullanın |
Teknik Kontrol Listesi ve Temel Çıkarımlar
Yavaş sorgu araştırmasını kapatmadan önce aşağıdakilerin her birini doğrulayın:
my.cnf‘daki[mysqld]bölümüslow_query_log = 1, geçerli birslow_query_log_fileyolu ve trafik profilinize uygun birlong_query_timeiçeriyor- Günlük dosyası ve üst dizini, yazma izinleriyle
mysqlsistem kullanıcısına aittir; SELinux sistemlerinde dosya bağlamımysqld_log_tolarak ayarlanmıştır SHOW VARIABLES LIKE '%slow_query%', servis yeniden başlatmasının ardındanslow_query_log = ONve doğru dosya yolunu onaylarSHOW GLOBAL STATUS LIKE 'Slow_queries', nitelikli sorguların gerçekten gerçekleştiğini doğrulayan sıfır olmayan ve artan bir sayaç gösterirlog_queries_not_using_indexesetkindir ve önemsiz tek satırlık aramaların günlüğü doldurmasını önlemek içinmin_examined_row_limitile eşleştirilmiştirlog_slow_admin_statements, beklenmedik tablo kilitlerinin yaygın kaynakları olanALTER TABLE,OPTIMIZE TABLEve benzeri DDL işlemlerini yakalamak için etkindirmysqladmin flush-logs‘ı çağıran birpostrotatekancasıyla birlogrotateyapılandırması mevcuttur- Günlüğü toplamak için
pt-query-digestveyamysqldumpslowçalıştırdınız ve toplam yürütme süresine göre ilk 3–5 sorguyu belirlediniz - Tanımlanan her sorgu
EXPLAIN(veya MySQL 8.0+’daEXPLAIN ANALYZE) ile analiz edildi ve uygun dizinler eklendi ya da sorgu mantığı yeniden yapılandırıldı - Optimizasyon döngüsü tamamlandıktan sonra devam eden I/O yükünü en aza indirmek için yavaş sorgu günlüğü devre dışı bırakıldı veya
long_query_timeyükseltildi
SSS
Yavaş sorgu günlüğünü etkinleştirmek veritabanı performansını etkiler mi?
Tipik bir üretim iş yükünde 1 saniye veya daha yüksek bir eşikte, yük ihmal edilebilir düzeydedir — genellikle toplam sorgu yürütme süresinin %1’inden azdır. Yük yalnızca long_query_time 0,1 saniyenin altına ayarlandığında veya log_queries_not_using_indexes çok sayıda küçük, dizinsiz tabloya sahip bir şemada etkinleştirildiğinde ölçülebilir hale gelir. Bunu azaltmak için log_slow_rate_limit (MariaDB) kullanın veya min_examined_row_limit‘ı yükseltin.
MySQL veya MariaDB’yi yeniden başlatmadan yavaş sorgu günlüğünü etkinleştirebilir miyim?
Evet. SUPER veya SYSTEM_VARIABLES_ADMIN yetkisine sahip herhangi bir MySQL istemci oturumundan SET GLOBAL slow_query_log = 'ON' ve SET GLOBAL long_query_time = 1 kullanın. Değişiklik hemen geçerli olur. Yeniden başlatmalar arasında kalıcı olmaları için aynı değerleri my.cnf‘a yazın.
Yavaş sorgu günlüğünde Query_time ile Lock_time arasındaki fark nedir?
Query_time, sunucunun sorguyu aldığı andan istemciye son satırı gönderdiği ana kadar geçen toplam duvar saati süresidir. Lock_time ise bu toplamın tablo veya satır kilitlerini almak için beklemeye harcanan kısmıdır. Lock_time‘ın Query_time‘a yakın olduğu bir sorgu, dizin sorunu değil kilit çakışması sorunudur — çözüm dizin eklemek değil, işlem tasarımını veya kilit kapsamını azaltmayı içerir.
slow_query_log = ON olmasına rağmen yavaş sorgu günlüğü dosyam neden boş?
En yaygın nedenler şunlardır: (1) hiçbir sorgu henüz long_query_time‘ı aşmadı — SHOW GLOBAL STATUS LIKE 'Slow_queries' ile doğrulayın; (2) günlük dosyası yolu mevcut değil veya mysql kullanıcısının yazma izni yok; (3) SELinux sistemlerinde dosya bağlamı yanlış; (4) slow_query_log_file değişkeni, incelediğinizden farklı bir yola işaret ediyor — SHOW VARIABLES LIKE 'slow_query_log_file' ile onaylayın.
Yavaş sorgu günlüğündeki en zararlı tek sorguyu nasıl bulurum?
pt-query-digest çalıştırın ve R/Call (çağrı başına incelenen satırlar) veya Response time (toplam kümülatif süre) değerine göre sıralayın. Response time sıralamasının en üstündeki sorgu en fazla toplam veritabanı süresini tüketiyor demektir ve EXPLAIN analizi ile dizin optimizasyonu için ilk hedef olmalıdır. pt-query-digest mevcut değilse, tek en yüksek toplam süreli sorguyu çıkarmak için mysqldumpslow -s t -t 1 kullanın.
