Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

MySQL Stored Procedure ve Function'ların Performans Etkilerini Analiz Etme ve Optimizasyon

webnix

Üye
Katılım
14 Mart 2026
Mesajlar
17
Merhaba arkadaşlar, bugün sizlere MySQL'de sıkça kullandığımız Stored Procedure ve Function'ların performansını nasıl analiz edeceğimizi ve kritik noktalarda nasıl optimizasyon yapabileceğimizi anlatacağım. Bu yapılar, iş mantığını veritabanı katmanına taşımak için harikadır, ancak yanlış kullanıldığında sunucu yükünü ciddi şekilde artırabilir. Gelin bu gizli performans tuzaklarını birlikte inceleyelim.

🔍 Performans Analiz Araçları

Optimizasyona başlamadan önce, nerede sorun olduğunu bilmemiz gerekir. MySQL'in bize sunduğu harika araçlar var.

İlk olarak, bir prosedürün çalışma süresini ve detaylarını görmek için PROFILING özelliğini açalım. Bu, benim sunucularda genelde ilk baktığım yerdir.

SQL:
SET profiling = 1;
CALL your_procedure_name();
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;

Daha detaylı analiz için PERFORMANCE_SCHEMA tablolarını kullanıyoruz. Özellikle `events_statements_history_long` tablosu altın değerindedir.

SQL:
SELECT EVENT_NAME, SQL_TEXT,
       TIMER_WAIT/1000000000 AS 'Duration (ms)',
       LOCK_TIME/1000000000 AS 'Lock Time (ms)'
FROM performance_schema.events_statements_history_long
WHERE EVENT_NAME LIKE '%procedure_name%'
ORDER BY TIMER_WAIT DESC
LIMIT 10;

⚙️ Optimizasyon Stratejileri

Analiz yaptık, yavaşlığın kaynağını bulduk. Şimdi sıra optimizasyonda. İşte benim genelde uyguladığım yöntemler.

1. Cursor Kullanımını Minimize Edin: Loop içinde cursor kullanmak çok maliyetlidir. Mümkünse set tabanlı işlemlere yönelin.
2. Geçici Tablo Yönetimi: Memory tablosu kullanıyorsanız, boyutunu tmp_table_size ve max_heap_table_size parametreleri ile kontrol edin. Çok büyükse disk tablosuna dönüşür ve performans düşer.
3. Parametre Optimizasyonu: IN, OUT, INOUT parametrelerini doğru kullanın. Gereksiz OUT parametresi, veri taşıma maliyeti getirir.

⚠️ Kritik Performans Tuzakları

Bu noktalara çok dikkat etmelisiniz, aksi halde sunucu yükü beklenmedik şekilde artabilir.

Fonksiyonlar ve WHERE Koşulu: Bir fonksiyonu WHERE koşulunda kullanmak, genellikle tam tablo taramasına (full scan) sebep olur. Mümkünse sütunu fonksiyona sokmadan önce filtreleyin.
Deterministic Fonksiyonlar: Eğer fonksiyonunuz her zaman aynı girdi için aynı çıktıyı üretiyorsa, mutlaka DETERMINISTIC olarak tanımlayın. Bu, MySQL'in sonucu cache'lemesine izin verir.
Recursive Call (Özyineleme): Procedure'lerin birbirini veya kendini çağırması kontrolsüz bırakılırsa, sunucuyu kilitleyebilir. Derinlik sınırı koyun.

📊 Konfigürasyon ve İzleme

Sistem geneli için bazı ayarları gözden geçirmek faydalı olacaktır. /etc/mysql/my.cnf veya /etc/my.cnf dosyanızda şu parametrelere bakın:

INI:
# Procedure cache boyutu
stored_program_cache = 256

# Derin özyineleme sınırı (MySQL 8.0+ için ct_max_recursion_depth)
cte_max_recursion_depth = 1000

Ayrıca, hangi procedure'lerin en sık ve en yavaş çalıştığını düzenli izlemek için aşağıdaki gibi bir sorgu ile rapor alabilirsiniz:

SQL:
SELECT ROUTINE_SCHEMA, ROUTINE_NAME,
       COUNT_STAR AS 'Çağrılma Sayısı',
       SUM_TIMER_WAIT/1000000000 AS 'Toplam Süre (ms)',
       AVG_TIMER_WAIT/1000000000 AS 'Ortalama Süre (ms)'
FROM performance_schema.events_statements_summary_by_program
WHERE OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION')
AND COUNT_STAR > 0
ORDER BY SUM_TIMER_WAIT DESC;

Sonuç olarak, Stored Procedure ve Function'lar güçlü araçlardır ama bu gücü kontrollü kullanmalıyız. Sürekli izleme, profil çıkarma ve basit optimizasyon kuralları ile sunucu performansını koruyabilir, hatta artırabiliriz.

Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Özellikle yüksek trafikli sistemlerde farklı bir yaklaşımınız var mı? Tecrübelerinizi paylaşın veya aklınıza takılan bir şey olursa aşağıya yazın, birlikte tartışalım.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri