MySQL stres testi ve yük testi: sorgu gecikmesi ve bağlantı sınırı
Bir MySQL ya da MariaDB sunucusunun kaç eşzamanlı sorguyu hangi gecikmeyle karşıladığını ve nerede tıkandığını görmek için en net yol, uygulamanın sorgularını veritabanına doğrudan, artan yükte göndermektir. Yük testi beklenen trafikte gecikmeyi ölçer; stres testi yükü basamak basamak artırıp sınırı bulur. Genel yöntem veritabanı yük testi rehberindedir; bu sayfa MySQL'e özgü kısmı anlatır.
MySQL bağlantısı
| Varsayılan port | 3306 |
|---|---|
| Yer tutucu (parametre) | ? |
| Veritabanı / servis | veritabanı adı |
| TLS için sürücü parametresi | — |
| Okumalar salt okunur transaction'da | Evet |
- Bağlantılar → Bağlantı ekle'ye tıklayın, Tür olarak MySQL / MariaDB seçin ve bir ad verin (ör.
orders-db). - Sunucu, Port (boşsa 3306), Veritabanı / servis, Kullanıcı ve Parola'yı girin. Mümkünse yalnızca gerekli tablolarda
SELECTyetkisi olan ayrı bir kullanıcı kullanın; parola şifreli saklanır, testte yalnızca bağlantının adı geçer. - En çok açık bağlantı (runner başına): varsayılan 50. Toplam bağlantı ≈ runner sayısı × bu değer; veritabanının bağlantı sınırını aşmayacak şekilde ayarlayın.
- Kaydet, sonra Test et. Veritabanına yalnızca bir bastion üzerinden ulaşılıyorsa bağlantıya bir SSH tüneli ekleyin.
MySQL için SQL adımı
Sorguyu Sorgu alanına sabit metin olarak yazın; değerleri ? yer tutucusuyla Parametreler'de verin. Parametreler {{__VU}}, {{$randInt 1 100000}}, çıkarılmış değişkenler ya da CSV veri dosyasından değerler içerebilir; sorgu metninin içine şablon yazılamaz, böylece SQL enjeksiyonu olmaz. Check sekmesinde örneğin Satır sayısı = 1 ekleyin, Dene ile tek iterasyonu çalıştırıp dönen satırları görün, sonra Kaydet.
{"id": "my", "name": "MySQL", "protocol": "sql", "connection": "mysql-db",
"sql": {"query": "SELECT * FROM customers WHERE email = ?", "params": ["user{{__VU}}@example.com"]}}Bir okumanın süresi pool'dan bağlantı beklemeyi, sorguyu ve bütün satırların alınmasını kapsar. Satırlar JSON nesneleri dizisi olarak kontrollere ve değişken çıkarmaya gider ($[0].status gibi). Hatalar türüne göre ayrılır: zaman aşımı, bağlantı reddi, yetki, bulunamayan tablo, kısıt ihlali, sözdizimi ve salt okunur ihlali.
Veriyi korumak
Spitfire bir sorgunun okuma mı yazma mı olduğunu kendisi anlar ve okuma sayamadığı her şeyi yazma sayar. Yazmalar adımda açıkça onaylanmadan test kaydedilmez, onaylanmışsa test her başlatıldığında ayrıca onay ister ve onay denetim kaydına yazılır (güvenlik beyanı).
MySQL ve MariaDB'de okuma sayılan her sorgu ayrıca salt okunur bir transaction içinde çalışır ve geri alınır. Okuma gibi görünüp veri değiştiren bir sorguyu veritabanının kendisi reddeder; koşuda Cannot execute statement in a READ ONLY transaction hatası görünür.
Hangi sorguları yüklemeli?
Hangi sorguların yükleneceğini MySQL'in performance schema'sı söyler: sorgu kalıplarını (digest) çağrı sayıları ve toplam süreleriyle tutar. En çok çağrılan ve toplamda en çok süre alan birkaç sorgu, testin iskeletidir.
Bu istatistikleri elle aktarmanız gerekmez: digest istatistikleri içe aktarılır ve en çok çağrılan sorgular çağrı sayılarıyla ağırlıklandırılmış tek bir SQL adımına dönüşür; kurulum yöneticileri istatistikleri doğrudan bağlantıdan da okuyabilir (query mix).
Sorguları elle yazmak yerine veritabanının kendi schema'sından önerilmesini de isteyebilirsiniz (kurulum yöneticileri; schema'dan query önerileri). MySQL için gereken yetkiler: veritabanında SELECT, SHOW VIEW; istatistikler için isteğe bağlı PROCESS ve performance_schema erişimi. Her öneri EXPLAIN (asla ANALYZE değil) ile kontrol edilir: yalnızca plan alınır, sorgu çalıştırılmaz; her önerinin bir satır sınırı (LIMIT) vardır.
Ardından yük modelini seçin: beklenen eşzamanlılıkta sabit bir yük, ya da sınırı bulmak için basamaklı bir kırılma noktası testi. Sonuçları ortalamayla değil p95 ve p99 ile okuyun.
Sık karşılaşılan hatalar
Access denied for user …: kullanıcı adı ya da parola yanlış, ya da kullanıcının o veritabanına erişimi yok. Parolayı yeniden yazıp kaydedin; Veritabanı / servis alanını kontrol edin.too many connections: runner sayısı × En çok açık bağlantı (runner başına) veritabanının sınırını (max_connections) aşıyor; değeri düşürün ya da sınırı yükseltin.- Test et'te
connection refusedya da zaman aşımı: sunucu/port yanlış, veritabanına yalnızca iç ağdan ulaşılıyor ya da bir firewall engelliyor. Controller ve runner IP'lerine izin verin; bastion arkasında SSH tüneli kullanın.
Sık sorulan sorular
MySQL stres testi ile yük testi arasındaki fark nedir?Testler
MariaDB de destekleniyor mu?Testler
Yük testi MySQL'de veriyi değiştirir mi?Testler
Spitfire tek komutla Docker'a ya da Kubernetes'e kurulur; ücretsiz sürümde bütün test özellikleri ve protokoller açıktır.