Skip to content

July 17, 2011

9

MySQL Partition Kullanımı ve Partition Türleri

mysql partition icon

Merhaba arkadaşlar, bu yazımızda MySQL ‘e 5.1 versiyonunda eklenen bir özellik olan yatay bölümlemeyi (horizontal partitioning)  anlatacağız.

Yazının kapsamı; partition nedir, partition türleri nelerdir, MySQL hangi partition tiplerini destekler ve partition ne işe yarar sorularının cevabını vermeye çalışmaktır. Sonraki yazılarımızda tek tek partition tiplerini inceleyip örnek SQL kodlarını vereceğiz.

Partition Nedir ?

Partition, veritabanındaki tablolar üzerinde uygulanan, tablonun dikey (kolonların) veya yatay (satırlan) bölünmesiyle tablo verilerinin ayrı ayrı fiziksel dosyalarda tutulmasını sağlayan, verinin belirli bir bölümüyle çalışmak istediğinizde sadece o partition ‘a ait fiziksel dosyalar ve indeksleriyle işlem yapan veya tüm tablo verilerini yine tek tabloymuş gibi kullandıran bir özelliktir.

Neden Kullanmalıyız ?

Partition özelliğini çok yüksek boyutlu ve yoğun işlem gören tablolarda kullanmamız faydalı olacaktır. genellikle SELECT sorgularımızın performansını arttırmak için kullanabiliriz. Bazende yavaş çalışan ve MyISAM da table lock yaratan DELETE sorgularını hızlandırmak için kullanabiliriz.

Partition Türleri Nelerdir ?

Üç tür partition vardır;

  • Yatay bölümleme (horizontal partitioning) : Tablo verilerini yatay olarak bölerek uygulanır. Bu bölümlemede satırlar bölünmüş olur. Yatay bölümlemeye ait partition tipleride vardır. Bunlar;
    • Range Partitioning : Tablo verilerini belirli bir aralığa göre bölme,
    • List Partitioning : Tablo verilerini istenilen değerlere göre bölme,
    • Hash Partitioning : matematik fonksiyonu (MOD(expr, num)) kullanarak (bu fonksiyonu partition tiplerinde detaylı anlatacağız) bölme,
    • LinearHash Partition : matematik fonksiyonu (POWER, CEILING, LOG ile algoritma) kullanarak (bu fonksiyonları partition tiplerinde anlatacağız) bölme
  • Yatay Alt Bölümleme (Sub Partitioning) : Tüm bu yatay partition tiplerine alt bölümleme (Sub Partition) ekleyerek bölme
  • Dikey bölümleme (vertical partitioning) : Tablo kolonlarını bölmek suretiyle uygulanan bir yöntemdir. MySQL desteklemediği için değinmeyeceğiz.
Ayrıca Oracle ‘ın desteklediği birçok partition tipi daha vardır.

MySQL Hangi Partition Tiplerini Destekler ?

MySQL sadece yatay (horizontal) partition ve yatay alt bölümleme (Horizontal Sub Partitioning) özelliğini destekliyor. Yani dikey (vertical) partition özelliği MySQL ‘de şuan için bulunmuyor. Ayrıca MySQL ‘de partition yaparken sadece INT alanlar yada INT ‘e çevrilmiş ifadeler (örneğin: TO_DAYS(`last_update`) ) kullanılması gerekmektedir.

MySQL Partitioning Nasıl Çalışır ?

Kısaca değinecek olursak, MySQL Partitioning belirttiğiniz kırılmları ayrı fiziksel dosyalara ayırarak çalışır (INSERT, UPDATE, DELETE). Bu esnada tablodaki veri bütünlüğünü sağlar ve index yapılarını korur (PRIMARY veya UNIQUE key gibi). Yani normal tabloda olduğu gibi Primary Key bir alana aynı kaydı tekrar INSERT etmez.

Örnek Kullanımları ?

MySQL partition ihtiyaca göre bir çok şekilde kullanılabilir. Sonraki yazılarımızda örnek senaryo ve kodları bulacaksınız. Ancak biz birkaç senaryoya özetle değinmek istiyoruz.

Senaryo 1 (SELECT): Sitenizde ki satışlar hakkında (aylık 500 bin satış ve 10 yıllık veri olduğunu varsayalım) çeşitli istatistik sorguları oluşturduğumuzu varsayalım. Bu sorguları hızlandırmak için satışların oluşturulma yılına göre ana partition, oluşturulma ayına göre alt partition olarak bölümlere ayırabilirsiniz. Ve böylelikle satış istatistikleri alırken hem sunucunuz fazla yorulmaz hemde sorgu süreleri çok hızlanmış olur.

Senaryo 2 (SELECT): Bir başka kullanım örneği de sitenize gelen ziyaretçilerin kaynaklarını tuttuğunuzu varsayalım. Bu örnekte günlük 300bin ziyaretçi aldığını düşünelim ve yine 10 yıllık data olsun. Ortalama 1 milyar tablo satırımız olacaktır. Burada son 1 ayda sitemize Google Adwords üzerinden gelen ziyaretcileri sorgulayacak olursak, MySQL 1 milyarlık tablo indekslerini dolaşmak zorunda kalacaktır. Ancak biz ziyaret tarihine göre Partition yaparsak, bu aya ait index dosya boyutu çok küçük olacağından sorgu çok hızlı çalışacaktır.

Senaryo 3 (DELETE): MySQL partition ‘u bazen DELETE sorgularımızı hızlandırmak için kullanabiliriz. İlk bakışta alakasız bir örnek gibi görülsede senaryo 2 de bulunan örnek üzerinden gidelim. Biz sadece son 10 yılın ziyaretçi kaynaklarını tutumak istiyor olalım. Ve belirli sıklıkla eski dataları silmek istediğimizi varsayıyoruz. Bu durumda MySQL 1 milyar kayıtlı tablo datası ve indekslerini dolaşıp belirttiğimiz tarih aralıklarını bulup silecektir. Ancak MySQL partition kullanırsak o tarihe ait partitionu silerek tüm bu işlemi 1 saniyenin altında bir sürede tamamlamış oluruz.

Kısıtlamalar Neler ?

  • Yazımızın girişinde de bahsettiğimiz gibi MySQL 5.1 ve üzeri versiyonları
  • Sadece INT alanlar veya INT dönen ifadeler örneğin: TO_DAYS(`last_update`)
  • MERGE, CSV tablo tiplerinde kullanılamaz (ve bazı depolama motorlarında belirli versiyona kadar desteklenmiyor)
Burada amacımız translate değil tecrübelerimizi paylaşmak olduğundan, MySQL partition kısıtlamaları yazısına göz atmanızı öneririz.

Sonuç ?

Yazımızda da bahsettiğimiz gibi MySQL partition ihtiyaca göre çok farklı kullanım örnekleri ortaya çıkarır. Burada yazılarımıza yorumlarla katılırsanız en yaygın kullanım örneklerini belirlemiş oluruz ve o örnekleri tartışırız.

Son olarak MySQL partition sadece kullanmış olmak için değil gerçekten ihtiyaç duyulan noktalarda kullanılırsa çok işinize yarayacağını belirtir iyi günler dileriz.

Kaynak : MySQL Partitioning (MySQL.com)

Toplam 9 Yorum Yorum Yaz
  1. Özgün TARHAN
    Aug 10 2011

    Tabi ustadin bu guzel yazisina ek olarak, SQL sorgularimizin partition tarafindaki etkilerini gorebilmek ve SQL lerimizi duzenlemek icin;

    # explain partitions SQL_SORGUSU;

    komutunu da burada belirtmeliyiz.

    Partition yapmak SQL sorgularini optimize etmeden en iyi performansi veremeyebilir.

    Ornegin aya gore Range Partition yapilmis tabloda bir uyemizmin son bir senelik login bilgilerini alacagimiz SQL sorgusu;

    # select * from login where user_id=’25444′ and login_date between ‘2011-01-01’ and ‘2010-01-01’

    gibi yazilirsa gorulecektir ki tum partitionlar mysql engine tarafindan gezilecektir.Nedeni cok aciktir ki ile once tum partitionlar user_id icin taranacak sonrasinda ise girdigimiz zaman kriterine gore filtrelenecektir.

    Daha dogru sorgu;

    # select * from login where login_date between ‘2011-01-01’ and ‘2011-01-01′ and user_id=’25444’

    seklinde yazilirsa oncelikle sadece tarih araliginda kalan partitionlar gezilecek ve cok daha iyi performans alinacaktir.

    Unutmadan belirtelim partition destegi MySQL5.1 ile birlikte geliyor.Bu ozellikten faydalanmak icin oncelikle versiyon yukseltmeniz gerekebilir.

    Mustafa Hocanin da dedigi gibi milyarlik tabloda delete sorgusu calistirmak yerine istedigimiz zaman araligina ait partitionlar icin drop partition calistirarak cok hizli ve veritabanini kilitleden silebilirsiniz.

    Herkese bol MySQL li gunler …

    Reply
    • Aug 10 2011

      Özgün hocam yazıyı tamamlayan görüşlerin ve yüksek hit alan onlarca sunucuyu yönetmekle edindiğin tecrübelerini bu bloğa yorumun aracılığıyla taşıdığın için teşekkür ediyorum.

      Partition tipleri, partition yönetimi, partition bakımı yazıları henüz taslak aşamasında. Bu yazılar yayınlandığında görüşlerini almak içeriğin kalitesini artıracaktır.

      Reply
    • Bülent Gerçek
      Oct 23 2012

      Bu değerli bilgileri, özenli yazılmış metinlerle diğer insanların paylaşımına açtığınız için siz yazılım emekçilerine teşekkürler. Bilgileriniz çok yararlı oldu. Saygılar.

      Reply
    • Gökhan E.
      Jul 29 2013

      Bidiğim kadarıyla Query Optimize bu işi yapıyor, sorguda user_id sağda veya solda olsada farketmez, MySQL bunu halledecektir.

      Reply
  2. Uğur
    Nov 4 2011

    Sayın Kırımlı,
    Detaylı anlatımlarınız ve değindiğiniz çok ince ve nadir bulunan konularda yazdığınız için teşekkürler.
    Özellikle Handler Socket eklentisi bugünlerde tam aradığım şey.

    Özgün Bey’e de selam vermeden geçmek olmaz 🙂

    Yazılarının devamını bekliyoruz.

    Reply
    • Nov 4 2011

      Uğur,

      Değerli yorumun için teşekkür ediyorum. HandlerSocket ve partition konularında detay ve devam yazılarını önümüzdeki günlerde yazmayı planlıyorum.

      Sevgilerle

      Reply
  3. Ahmet
    Sep 2 2014

    Emeğinize sağlık, çok güzel anlatmışsınız.

    Reply

Trackbacks & Pingbacks

  1. MySQL vs Memcache vs HandlerSocket MySQL | Mustafa KIRIMLI
  2. Partition | Coding

Leave a Reply to Gökhan E.

(gerekli)
(gerekli)