MySQL Partition Nedir? Kullanımı

Yazıda partition nedir ile MySQL Partition anlatılmış, partition kullanımı çeşitli örneklerle anlatılmıştır.

Partition Nedir?

MySQL ve gelişmiş VTY sistemlerinde kullanılan partition kelimesini bölme, ayırma olarak çevirebiliriz.

Veri tabanı tasarımı sırasında yapılan normalizasyon ve index düzenlemesi ne kadar iyi olursa olsun yüksek boyutlu veriler bir süre sonra yavaşlamaya başlayacaktır.

Verilerin yavaşlamasını önlemek için partition ve dağıtık MySQL sunucuları kullanılabilir.

Partition kavramını işletim sistemlerindeki sürücü bölümlemeye benzetebiliriz.

Partition özelliği kullanarak verilerin belirli bölümleri fiziksel olarak parçalara ayrılır.

Örneğin; Ürün bilgilerinin bulunduğu urunler tablosundaki ilk 1000 kayıt birinci bölümde, ikinci 1000 kayıt ikinci bölümde gibi bölümlere ayırabiliriz. Benzer şekilde işlem yoğunluğuna göre tarih işlemlerini yıllara, aylara ve günlere göre ayırabiliriz.

Partition özelliği sadece sayısal verileri içeren veya sayısal veriye çevrilebilen sütunlarda kullanılır.

Partition kullanımı

Partition yatay ve dikey olmak üzere ikiye ayrılır. Partition türleri VTYS göre desteği farklılık gösterir.

MySQL sadece yatak bölümlemeyi desteklemektedir. Bölümleme veri tabanı tasarımı sırasında yapılacağı gibi sonradan da yapılabilir.

Partition türleri RANGE, LIST, HASH ve KEY olmak üzere dört bölümden oluşur.

RANGE: Sütunu belirli bir aralığa göre bölümlemek için kullanılır.

CREATE TABLE urunler (
  urun_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
)
PARTITION BY RANGE(urun_id)(
  PARTITION p0 VALUES LESS THAN (1000),
  PARTITION p1 VALUES LESS THAN (2000),
  PARTITION p2 VALUES LESS THAN (3000),
  PARTITION p3 VALUES LESS THAN (4000),
  PARTITION p4 VALUES LESS THAN MAXVALUE
);

Oluşturulan bölümler (partition) ile ilgili bilgiye

EXPLAIN PARTITIONS SELECT * FROM urunler;

veya

SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'urunler';

komutu ile ulaşabilirsiniz.

LIST: Sütunu belirli değere göre bölümlemek için kullanılır.

CREATE TABLE urunler (
  urun_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
)
PARTITION BY LIST(urun_id)(
  PARTITION p0 VALUES IN(1, 2, 5),
  PARTITION p1 VALUES IN(3, 4),
  PARTITION p2 VALUES IN(9, 6),
  PARTITION p3 VALUES IN(7, 8)
);

Komut sonucunda p0 bölümünde urun_id değeri 1, 2 ve 5 olan değerler saklanacak p1, p2, p3 değerleri de benzer şekilde parantez içerisine yazılan değerleri saklayacaktır.

HASH ve KEY: MySQL bölümlemeyi özel algoritmik ifadeye göre yapar.

Bölümleme türü olarak KEY seçilirise, MySQL tablodaki PRIMARY KEY veya UNIQUE KEY’i taban alarak işlem yapar.

DROP TABLE IF EXISTS urunler;
CREATE TABLE IF NOT EXISTS urunler (
  urun_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
)
PARTITION BY KEY()
PARTITIONS 5;

Tabloda PRIMARY KEY veya UNIQUE KEY yoksa hata verecektir.

Benzer şekilde PRIMARY KEY veya UNIQUE KEY sütunu seçilerek bölümleme yapılabilir.

DROP TABLE IF EXISTS urunler;
CREATE TABLE IF NOT EXISTS urunler (
  urun_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
)
PARTITION BY HASH(urun_id)
PARTITIONS 5;

HASH bölümleme türü KEY bölümleme türüne benzer şekilde oluşturulur. Ancak arka planda yapılan işlemler farklıdır.

Bölümleme işlemleri yapılsa da iyi bir sorgu oluşturulmamışsa performans artışı olmayabilir.

Performans artışı için sorgu ifadelerinde bölüm seçme işlemi yapabilir.

Aşağıdaki örnekte p0 yani ilk 1000 kaydın olduğu bölümünde urun_id değeri 250 altındaki değerleri arayacaktır.

SELECT * FROM urunler PARTITION (p0) WHERE urun_id < 250;

Benzer şekilde sorgularda ilk arama kriteri olarak bölümlenen sütun adının yazılması etkili olacaktır.

SELECT * FROM urunler WHERE urun_id < 1000 AND urun_adi = 'MySQL Kitabı';

Bölümleme sonrasında MySQL ile performans denemeleri yaparak en uygun bölümleme türü seçilmelidir.

Ayrıca bölümleme için optimizasyon komutları da ANALYZE, OPTIMIZE, CHECK, REPAIR kullanılır.

Hayırlı günler dilerim.

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir