
SQL veritabanlarının performansını artırmak, büyük ölçekli projelerde hız ve verimlilik sağlamak için kritik bir konudur.
Bu rehberde, MySQL ve PostgreSQL gibi popüler veritabanları için en etkili optimizasyon tekniklerini inceleyeceğim
Denormalizasyon:
Bu ayarlar, büyük sorguların RAM kullanımını artırarak disk erişimini minimize eder.
SQL veritabanlarında yüksek performans sağlamak için:
1️⃣ İndeks Kullanımı (Indexing)
İndeksler, verileri daha hızlı sorgulamak için kullanılan yapılar olup, özellikle WHERE ve JOIN işlemlerinde büyük hız artışı sağlar.- 🔹 İndeks Oluşturma:
SQL
CREATE INDEX idx_kullanici_adi ON kullanicilar(kullanici_adi);
- 🔹 İndeksleri Listeleme:
SQL
SHOW INDEX FROM kullanicilar; -- MySQL
SELECT * FROM pg_indexes WHERE tablename = 'kullanicilar'; -- PostgreSQL
- 🔹 İndekslerin Faydası:
- Arama hızlarını artırır.
- JOIN işlemlerini hızlandırır.
- ORDER BY işlemlerinde performans iyileştirir.
2️⃣ Sorgu Optimizasyonu
SQL sorgularını en verimli hale getirmek için aşağıdaki teknikleri kullanabilirsiniz.- 🔹 EXPLAIN ANALYZE Kullanımı (Sorgu planını incelemek için):
SQL
EXPLAIN ANALYZE SELECT * FROM siparisler WHERE durum = 'tamamlandı';
- 🔹 JOIN Yerine Subquery Kullanımı (Bazı durumlarda daha hızlı olabilir)
SQL
SELECT * FROM kullanicilar WHERE id IN (SELECT kullanici_id FROM siparisler WHERE tutar > 1000);
- 🔹 LIMIT ve OFFSET Kullanımı (Gereksiz veri çekmeyi önler):
SQL
SELECT * FROM urunler ORDER BY fiyat DESC LIMIT 10;
3️⃣ Veri Normalizasyonu ve Denormalizasyonu
- 🔹 Normalizasyon: Veri tekrarını önleyerek veritabanını daha tutarlı hale getirir. 🔹 Denormalizasyon: Büyük ve karmaşık sorguları hızlandırmak için bazı veri tekrarlarına izin verir.
SQL
CREATE TABLE siparisler (
id SERIAL PRIMARY KEY,
musteri_id INT,
urun_id INT,
miktar INT
);
SQL
ALTER TABLE siparisler ADD COLUMN musteri_adi TEXT;
4️⃣ Önbellekleme (Caching) Kullanımı
- 🔹 Memcached veya Redis gibi önbellekleme sistemleri, sık kullanılan sorguların performansını artırır.
PHP
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'top_urunler';
if (!$data = $redis->get($cacheKey)) {
$data = $db->query('SELECT * FROM urunler ORDER BY satis_sayisi DESC LIMIT 10')->fetchAll();
$redis->setex($cacheKey, 3600, json_encode($data));
}
- 🔹 Materialized Views (PostgreSQL için)
SQL
CREATE MATERIALIZED VIEW en_cok_satanlar AS
SELECT urun_id, COUNT(*) as satis_miktari FROM siparisler GROUP BY urun_id;
5️⃣ Bağlantı Havuzu (Connection Pooling) Kullanımı
- 🔹 PostgreSQL için PgBouncer, MySQL için ProxySQL gibi bağlantı havuzu araçları, veritabanı bağlantılarını yöneterek yükü azaltır.
INI
[databases]
db1 = host=127.0.0.1 port=5432 dbname=veritabani
6️⃣ Veritabanı Ayarlarının Optimizasyonu
- 🔹 MySQL’de InnoDB Buffer Pool Ayarı:
INI
[mysqld]
innodb_buffer_pool_size = 2G
- 🔹 PostgreSQL’de Work Mem Ayarı:
INI
work_mem = 64MB

- ✔ Doğru indekslemeleri yapın.
- ✔ Sorgularınızı EXPLAIN ANALYZE ile test edin.
- ✔ Önbellekleme sistemlerini kullanın.
- ✔ Bağlantı havuzları ile yükü dengeleyin.
- ✔ Veritabanı yapılandırmalarınızı optimize edin.
Benzer Yazılar
Yorumlar ()
Henüz yorum yok. İlk yorum yapan sen ol!