Tablo Bölümleme Nasıl Yardımcı Olur?


28

Masa bölümlerinin artıları ve eksileri fikrini almakta güçlük çekiyorum. 8 masadan oluşan bir proje üzerinde çalışmaya başlamak üzereyim ve bunlardan biri 180-260 milyon kayıt yapacak ana veri masası olacak. Düzgün bir şekilde indekslenmiş bir tablo olacağı için, tablo kayıtlarını bu şekilde 20 milyon ile sınırlandırmayı düşünüyorum, 9-13 tablo oluşturmak zorunda kalacağım.

Ancak performansı nasıl artıracağından emin değilim çünkü aynı makinede (32GB RAM) oturacaklar mı?

MySQL kullanıyorum ve tablolar MyISAM olacaktı ve büyük tablo kimliği alanında indeks içerecek ve tam metin araması vb. Gibi başka karmaşıklıklar olmayacaktı.

Lütfen ayrıca tablo bölümleme vs veri tabanı bölümlendirme üzerine ışık tutunuz.


Lütfen kimliğin dışındaki tabloya göre ne tür bir dizinlenmiş arama gerçekleştirileceğini açıklayın. Yapılacak bölümleme türüne dair size ipucu verir.
RolandoMySQLDBA 7:11

Sadece kimlik olacak.
Rick James

'Sadece kimlik' hala bize bir şey söylemiyor. Kimlikleri tüm kimlikleri arasında nasıl dağıtıyoruz? Esas olarak yeni olanlar için sorgulama yapıyor musunuz, gerçekten dağıtılmış mı? Veri erişimi çoğunlukla okunacak mı yoksa çoğunlukla mı yazılacak? Bunların hepsi size özel olarak yardımcı olabilmemiz için önce cevaplamamız gereken önemli sorular. Bu, aşağıdaki cevapların gerçekten yararlı olduğunu söyledi :)
Walter Heck

1
İşte bu konuya başladıktan 5 yıl sonra hislerim.
Rick James

Yanıtlar:


32

Aşağıdaki sadece çılgınca çılgınca ve öfkeli ...

Tüm verileri tek bir tabloda bırakırsanız (bölümlendirme yapmazsanız), bir anahtar kullanarak O (log n) arama süresine sahip olursunuz. Dünyanın en kötü endeksini alalım, ikili ağacı. Her ağaç düğümü tam olarak bir anahtara sahiptir. 268.435.455 (2 ^ 28 - 1) ağaç düğümlü, mükemmel dengelenmiş bir ikili ağaç, 28 yüksekliğinde olur. Bu ikili ağacı 16 ayrı ağaca bölerseniz, her biri 16.777.215 (2 ^ 24 - 1) olan 16 ikili ağaç elde edersiniz. 24 yüksekliğe sahip ağaç düğümleri. Arama yolu,% 14.2857'lik bir yükseklik azaltma olan 4 düğüm tarafından azaltılır. Arama süresi mikrosaniye ise, arama süresinde% 14.2857'lik bir azalma ihmal edilebilir düzeyde değildir.

Şimdi gerçek dünyada, bir BTREE endeksinde birden fazla anahtar bulunan treenodes olacaktı. Her BTREE araması, sayfa içinde ikili bir arama yaparak başka bir sayfa için olası bir terbiyeciyi gerçekleştirir. Örneğin, her bir BTREE sayfası 1024 anahtar içeriyorsa, 3 veya 4 olan bir ağaç yüksekliği norm olur, aslında kısa bir ağaç yüksekliği.

Bir tablonun bölünmesinin zaten küçük olan BTREE'nin yüksekliğini azaltmadığına dikkat edin. 260 miliyon sıraya bölünmesi göz önüne alındığında, aynı yükseklikte birden fazla BTREE'ye sahip olma olasılığı bile güçlüdür. Bir anahtar aramak, her seferinde tüm kök BTREE sayfalarından geçebilir. Sadece bir tane gerekli arama aralığının yolunu yerine getirecektir.

Şimdi bunu genişletin. Tüm bölümler aynı makinede var. Her bölüm için ayrı diskleriniz yoksa, disk g / Ç ve iş mili dönüşleri bölüm arama performansının dışında otomatik bir darboğaz olarak sahip olacaktır.

Bu durumda, veritabanıyla ayrıştırma, kimliği utitlized olan tek arama anahtarı ise, ya hiçbir şey satın almazsınız.

Verilerin bölümlendirilmesi, aynı sınıfta mantıksal ve tutarlı olan verileri gruplandırmaya hizmet etmelidir. Verileri doğru bir şekilde gruplandırıldığı sürece her bir bölümü arama performansının ana düşünce olması gerekmez. Mantıksal bölümlemeyi elde ettikten sonra, arama süresine odaklanın. Verileri yalnızca kimlik numarasıyla ayırıyorsanız, okuma veya yazma için birçok veri satırına asla erişilemeyebilir. Şimdi, bu çok önemli bir husus olmalı: En sık erişilen tüm kimlik numaralarını bulun ve buna göre bölün . Daha az erişilen tüm kimlikler, 'mavi ayda bir kez' sorgusu için dizin aramasıyla hala erişilebilen büyük bir arşiv tablosunda bulunmalıdır.

Genel etki en az iki bölümden oluşmalıdır: Biri sık erişilen kimlikler için diğeri de kimlikleri geri kalanı için diğer bölümler. Sık erişilen kimlikleri oldukça büyükse, isteğe bağlı olarak bunu bölümlendirebilirsiniz.


16

200 milyon satır, tablonun bölünmesinden kesinlikle faydalanabileceğiniz bir aralıkta. Başvurunuza bağlı olarak, aşağıda listelenen avantajlardan bazılarına bahis oynayabilirsiniz:

  • Eski verileri temizleme kolaylığı 6 aydan daha eski kayıtları (örneğin) temizlemeniz gerekirse, tabloyu tarihte bölümlere ayırabilir ve daha sonra eski bölümleri değiştirebilirsiniz. Bu, bir tablodaki verileri silmekten çok daha hızlıdır ve genellikle canlı bir sistemde yapılabilir. OP'nin durumunda bu, sistem bakımı için yardımcı olabilir.

  • Birden fazla disk birimi Bölümleme, disk trafiğini hız için birden fazla disk birimine dağıtmak üzere verileri bölmenize olanak tanır. Modern bir RAID denetleyicisiyle, bunun OP için bir sorun olması muhtemel değildir.

  • Daha hızlı tablo ve aralık taramaları Gerçekten, operasyonel bir sistem bu tür bir şeyi yapmamalı, ancak bir veri ambarı veya benzer bir sistem bu tür bir sorguyu nicel olarak yapacaktır. Tablo taramaları temelde sıralı disk trafiğini kullanır, bu nedenle bunlar genellikle tablodaki satırların yüzde birkaçından fazlasını döndüren bir sorguyu işlemenin en etkili yoludur.

    Yaygın bir filtre ile bölümleme (genellikle zamana veya döneme dayalı), belirtme bölümleme anahtarına karşı çözümlenebiliyorsa, tablonun büyük parçalarının bu tür sorgulardan kaldırılmasını sağlar. Ayrıca, tablonun, büyük veri kümeleri için önemli performans kazanımları sağlayabilen birden fazla hacme bölünmesine izin verir. Normalde, bu operasyonel sistemler için bir sorun değildir.

OP'nin amaçları doğrultusunda, bölümlemenin operasyonel sorgular için çok fazla performans avantajı elde etmesi muhtemel değildir, ancak sistem yönetimi için faydalı olabilir. Büyük miktarlarda veri toplamlarını bildirmek için önemli bir gereklilik varsa, uygun bir bölümlendirme şeması buna yardımcı olabilir.


1

Bölümleme, tüm dizinleriniz bölümlenmişse, eşzamanlı olarak yeniden sıralama yapılmasına izin verir. Değilse, bölümler hala çok daha küçüktür ve yeniden düzenlemek için daha az çalışma alanı kullanırlar. Ve dahili olarak, herhangi bir "iyi" DBMS bölümlenmiş tablolara paralel olarak işler yapabilir. Bu büyük olasılıkla MySQL veya MyISAM içermez, tho ....


Bölümleme söz konusu olduğunda bile MySQL hiçbir paralel işlem yapmaz . MySQL yalnızca bir bölümü endeksler ; dolayısıyla UNIQUEve FOREIGN KEYbölümlenmiş tablolarda gerçekten mevcut değildir. MyISAM'a karşı InnoDB'ye göre bölümleme - bu konuda tartışılan şeyler açısından fark yok.
Rick James,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.