Gereksinimler ve Ön Hazırlık
Bölümlendirme stratejilerini uygulamak için güncel bir ilişkisel veritabanı yönetim sistemi (RDBMS) gereklidir. Bu rehberde PostgreSQL 17+ ve MySQL 8.4+ sürümlerini baz alıyoruz. Başlamadan önce sisteminizde aşağıdaki araçların kurulu olduğundan emin olun:
- Veritabanı Motoru: PostgreSQL veya MySQL/MariaDB.
- Yetkilendirme: Tablo oluşturma ve bölümlendirme (DDL) işlemleri için 'superuser' veya 'owner' yetkisi.
- Analiz Araçları: Sorgu planlarını incelemek için
EXPLAIN ANALYZEkomutuna erişim.
Bölümlendirme yapmadan önce mevcut tablonuzun istatistiklerini kontrol etmeniz önemlidir. Büyük tablolar üzerinde işlem yaparken veritabanı kilitlenmelerini (lock) önlemek için düşük trafikli saatleri seçmeniz önerilir.
Bölümlendirme Türleri: Hangi Stratejiyi Seçmeli?
Veritabanı bölümlendirme, verinin mantıksal olarak nasıl parçalanacağına göre üç ana kategoriye ayrılır. İhtiyacınıza göre doğru yöntemi seçmek, performansın anahtarıdır.
| Yöntem | Kullanım Senaryosu | Avantajı |
|---|---|---|
| Range (Aralık) | Tarih bazlı loglar veya zaman serisi verileri. | Eski verilerin kolayca arşivlenmesi. |
| List (Liste) | Bölge, kategori veya durum kodları. | Belirli kategorilere hızlı erişim. |
| Hash (Karma) | Eşit dağılım gerektiren kullanıcı verileri. | Verinin dengeli dağıtılması. |
Adım Adım Range (Aralık) Bölümlendirme Uygulaması
Range partitioning, genellikle zaman damgası içeren verilerde kullanılır. Örneğin, bir sipariş tablosunu aylara bölmek, eski siparişleri sorgularken sistemin tüm tabloyu taramasını engeller.
Aşağıdaki PostgreSQL örneğinde, siparişler tablosunu tarih aralıklarına göre nasıl böleceğimizi görelim:
CREATE TABLE siparisler (
siparis_id SERIAL,
siparis_tarihi DATE NOT NULL,
toplam_tutar DECIMAL(10,2),
PRIMARY KEY (siparis_id, siparis_tarihi)
) PARTITION BY RANGE (siparis_tarihi);
Yukarıdaki komut, ana tabloyu oluşturur ancak veri tutmaz. Şimdi bu tabloya bağlı alt bölümleri (partitions) oluşturmamız gerekir.
CREATE TABLE siparisler_2026_ocak PARTITION OF siparisler
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
CREATE TABLE siparisler_2026_subat PARTITION OF siparisler
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
Bu yapıda, siparis_tarihi kolonuna göre veriler otomatik olarak ilgili tabloya yönlendirilir. Sorgu çalıştırırken WHERE siparis_tarihi = '2026-01-15' dediğinizde, veritabanı sadece siparisler_2026_ocak tablosuna bakar.
List (Liste) Bölümlendirme ile Veri Gruplama
List partitioning, veriyi belirli değer kümelerine göre ayırır. Örneğin, kullanıcıların bulunduğu şehirlere göre veriyi bölmek, bölgesel raporlar oluştururken büyük hız kazandırır.
CREATE TABLE kullanicilar (
kullanici_id INT,
sehir_kodu VARCHAR(10),
ad VARCHAR(50)
) PARTITION BY LIST (sehir_kodu);
CREATE TABLE kullanicilar_istanbul PARTITION OF kullanicilar
FOR VALUES IN ('IST', '34');
CREATE TABLE kullanicilar_ankara PARTITION OF kullanicilar
FOR VALUES IN ('ANK', '06');
Bu yöntemde, sehir_kodu belirtilen değerler dışındaysa veritabanı hata verecektir. Bu yüzden "default" bir bölüm tanımlamak iyi bir pratiktir.
Hash Bölümlendirme ile Yük Dengeleme
Hash bölümlendirme, verinin bölümler arasında eşit dağılmasını sağlar. Büyük bir kullanıcı tablosunda, veriyi rastgele ama dengeli bir şekilde bölmek için kullanılır.
CREATE TABLE musteriler (
musteri_id INT,
musteri_adi TEXT
) PARTITION BY HASH (musteri_id);
CREATE TABLE musteriler_p1 PARTITION OF musteriler
FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE musteriler_p2 PARTITION OF musteriler
FOR VALUES WITH (MODULUS 4, REMAINDER 1);
Burada MODULUS toplam bölüm sayısını, REMAINDER ise o bölümün indeksini temsil eder. Bu yöntem, veritabanı üzerindeki I/O (girdi/çıktı) yükünü bölümler arasında eşitler.
Performans Testi ve Sorgu Planlama
Bölümlendirme yapmanın asıl amacı sorgu performansını artırmaktır. Bir sorgunun gerçekten bölümleri kullanıp kullanmadığını EXPLAIN komutu ile test edebilirsiniz.
EXPLAIN SELECT * FROM siparisler
WHERE siparis_tarihi = '2026-01-10';
Çıktıda Partition Selector veya sadece ilgili tablonun tarandığını görmelisiniz. Eğer Seq Scan on siparisler (tüm tablonun taranması) görüyorsanız, sorgunuzda bölümlendirme kolonunu kullanmıyorsunuz demektir.
Güvenlik Uyarısı: Bölümlendirme operasyonları sırasında tablo isimlerini dinamik olarak oluştururken SQL Injection riskine karşı dikkatli olun. Tablo isimlerini dışarıdan gelen kullanıcı girdileriyle doğrudan birleştirmeyin; her zaman beyaz liste (whitelist) kontrolü yapın.
Sıkça Sorulan Sorular
Bölümlendirme indeksleme yerine geçer mi?
Hayır, bölümlendirme bir veri düzenleme stratejisidir; indeksleme ise veri erişim hızlandırma yöntemidir. En iyi performans için her iki yöntemi birlikte kullanmalısınız.
Çok fazla bölüm oluşturmak performansı düşürür mü?
Evet, çok fazla bölüm (binlerce) veritabanı planlayıcısını yorabilir. İhtiyacınız kadar bölüm oluşturmak en sağlıklısıdır.
Bölümlendirilmiş tabloda Primary Key nasıl olmalı?
Bölümlendirme kolonunu, birincil anahtarınızın (Primary Key) bir parçası yapmanız zorunludur. Aksi takdirde, veritabanı benzersizlik kontrolünü bölümler arasında sağlayamaz.
Bölümlendirme sonrası veriyi taşımak zor mudur?
Modern veritabanları ATTACH ve DETACH komutları ile bölümleri ana tablodan ayırıp tekrar takmanıza izin verir, bu da veri taşımayı oldukça kolaylaştırır.
Hangi veritabanı motoru bölümlendirme için daha iyi?
PostgreSQL, deklaratif bölümlendirme konusunda oldukça olgundur. MySQL ise InnoDB motoru ile başarılı sonuçlar verir; seçiminiz projenizin ihtiyaçlarına ve mevcut altyapınıza bağlıdır.
Bölümlendirilmiş Tablolarda İleri Seviye Bakım ve Veri Yaşam Döngüsü Yönetimi
Bölümlendirme stratejisi uygulandıktan sonra en büyük zorluk, verinin zamanla büyümesi ve eski verilerin yönetiminin nasıl yapılacağıdır. Özellikle zaman serisi verilerinde, belirli bir tarihten eski verilerin silinmesi veya arşivlenmesi, bölümlendirme sayesinde "tabloyu boşaltmak" (truncate) kadar hızlı hale gelir. Bu süreç, geleneksel DELETE işlemlerinin yarattığı log yükünü ve performans kaybını ortadan kaldırır.
Partition Exchange (Bölüm Değişimi) Tekniği
Büyük veri kümelerinde, canlı bir tabloya veri eklemek veya veriyi arşivlemek için INSERT veya DELETE kullanmak yerine Partition Exchange yöntemini kullanmalısınız. Bu yöntem, bağımsız bir tabloyu, ana tablodaki bir bölümle yer değiştirmenizi sağlar. Bu işlem, verinin fiziksel olarak taşınmasını değil, sadece meta verinin güncellenmesini gerektirdiği için milisaniyeler sürer.
-- 1. Arşivlenecek veriyi tutacak boş bir tablo oluşturun
CREATE TABLE sales_archive_2023 LIKE sales_data;
-- 2. Ana tablodaki ilgili bölümü, boş tablo ile değiştirin (Exchange)
ALTER TABLE sales_data EXCHANGE PARTITION p2023
WITH TABLE sales_archive_2023;
-- 3. Artık p2023 bölümü boş, sales_archive_2023 tablosu ise dolu.
-- Veriyi güvenle yedekleyebilir veya silebilirsiniz.
Bölümlendirme Stratejilerinde Hata Ayıklama ve İzleme
Bölümlendirme yapıldıktan sonra sorgularınızın gerçekten ilgili bölümlere gidip gitmediğini (Partition Pruning) kontrol etmeniz gerekir. Eğer sorgu planı tüm bölümleri tarıyorsa (Full Partition Scan), bölümlendirme stratejiniz yanlış kurgulanmış demektir. Sorgu planını analiz etmek için EXPLAIN komutunu kullanmak kritik bir adımdır.
Partition Pruning Kontrolü
Bir sorgunun hangi bölümleri etkilediğini görmek için aşağıdaki adımları izleyin:
-- Sorgunun çalışma planını inceleyin
EXPLAIN PARTITIONS
SELECT * FROM sales_data
WHERE sale_date BETWEEN '2024-01-01' AND '2024-03-31';
-- Çıktıdaki "partitions" kolonuna bakın.
-- Eğer "p2024_q1" gibi sadece ilgili bölümleri görüyorsanız,
-- sorgunuz optimize edilmiş demektir.
Yaygın Hatalar ve İpuçları
- Fonksiyon Kullanımı:
WHEREkoşulunda bölümlendirme kolonuna fonksiyon uygulamayın (Örn:YEAR(sale_date) = 2024). Bu, veritabanının bölümleri atlamasını (pruning) engeller. Bunun yerine doğrudan aralık belirtin. - Bölüm Sayısı: Çok fazla bölüm (örneğin binlerce) veritabanı meta veri yönetimini yavaşlatabilir. Günlük bölümlendirme yerine, veri yoğunluğuna göre haftalık veya aylık bölümlendirmeyi tercih edin.
- İndeks Stratejisi: Bölümlendirilmiş tablolarda "Local Index" (her bölümün kendi indeksi) kullanmak, "Global Index" kullanmaktan genellikle daha performanslıdır. Global indeksler, bölüm silme veya taşıma işlemlerinde tüm indeksin yeniden oluşturulmasına neden olabilir.
Profesyonel İpucu: Eğer sisteminizde sürekli olarak "yeni bir bölüm oluşturma" ihtiyacı doğuyorsa, veritabanınızın INTERVAL bazlı otomatik bölümlendirme özelliğini destekleyip desteklemediğini kontrol edin. Bu özellik, veritabanının ihtiyaç duyulduğunda otomatik olarak yeni bölümler açmasını sağlar.
Sonuç
Sql & veritabanı ile büyük veri kümeleri için bölümlendirme yapmak, sisteminizin ölçeklenebilirliğini doğrudan etkileyen ileri seviye bir beceridir. Verinizi doğru strateji ile parçalayarak, sorgu yanıt sürelerini düşürebilir ve veritabanı bakım süreçlerinizi kolaylaştırabilirsiniz. Bir sonraki adım olarak, veritabanınızdaki mevcut yavaş sorguları analiz ederek, bu sorguların hangi kolonlar üzerinden filtrelendiğini belirleyin ve buna uygun bir bölümlendirme stratejisi kurgulayın.
Sorumluluk Reddi: Bu makaledeki kod örnekleri genel eğitim amaçlıdır. Üretim (production) ortamında herhangi bir veritabanı yapısı değişikliği yapmadan önce mutlaka veritabanı yedeği alınız ve değişiklikleri test ortamlarında doğrulayınız.


Yorumlar (0)
Yorum Yaz