Site icon Netopsiyon Online

Gelişmiş SQL Performans Teknikleri ve Optimizasyon

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


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:

CREATE INDEX idx_kullanici_adi ON kullanicilar(kullanici_adi);

🔹 İndeksleri Listeleme:

SHOW INDEX FROM kullanicilar; -- MySQL
SELECT * FROM pg_indexes WHERE tablename = 'kullanicilar'; -- PostgreSQL

🔹 İndekslerin Faydası:

Not: Gereksiz indeksler, ek depolama alanı tüketir ve INSERT, UPDATE, DELETE işlemlerini yavaşlatabilir. 🤔


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):

EXPLAIN ANALYZE SELECT * FROM siparisler WHERE durum = 'tamamlandı';

🔹 JOIN Yerine Subquery Kullanımı (Bazı durumlarda daha hızlı olabilir)

SELECT * FROM kullanicilar WHERE id IN (SELECT kullanici_id FROM siparisler WHERE tutar > 1000);

🔹 LIMIT ve OFFSET Kullanımı (Gereksiz veri çekmeyi önler):

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.

Örnek: Normalizasyon:

CREATE TABLE siparisler (
    id SERIAL PRIMARY KEY,
    musteri_id INT,
    urun_id INT,
    miktar INT
);

Denormalizasyon:

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.

Örnek: PHP ile Redis önbellekleme:

$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)

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.

Örnek: PostgreSQL’de bağlantı havuzu ayarları:

[databases]
db1 = host=127.0.0.1 port=5432 dbname=veritabani

6️⃣ Veritabanı Ayarlarının Optimizasyonu

🔹 MySQL’de InnoDB Buffer Pool Ayarı:

[mysqld]
innodb_buffer_pool_size = 2G

🔹 PostgreSQL’de Work Mem Ayarı:

work_mem = 64MB

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:

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.

Bu teknikleri uygulayarak, saniyeler süren sorguları milisaniyelere düşürebilirsiniz!

Exit mobile version