MySQL Bölümleme: Bölüm sayısı ile her bölümün boyutu arasında bir performans dengesi var mı?


10

Verimli bir şekilde bölmek istediğim büyük bir tablo (birkaç 100 milyon satır) var. Benim sorum, bölüm boyutu ile bölüm sayısı arasında bir denge olup olmadığıdır. Anladığım kadarıyla, sorguda (çoğu sorgu için) yalnızca sorgu için geçerli bölüm içinde arama yapmak zorunda olacağından, bölümde kullanılan bir sütundaki sorguların çoğu daha hızlı olacaktır. Bu nedenle, verimliliği en üst düzeye çıkarmak için büyük bir tabloyu maksimum bölüm sayısına bölmelisiniz, bu nedenle her bölümü mümkün olduğunca küçük hale getirmeniz mantıklı olacaktır. MySQL durumunda, bu 1024 bölüm anlamına gelir. Ancak çok sayıda bölüme sahip olmanın herhangi bir performans dezavantajı var mı? Öyleyse, optimum bölüm sayısını nasıl bulur?

Not: Stackoverflow'da zaten benzer bir soru var , ancak sadece bir cevap, (benim bakış açımdan) işareti kaçırıyor. Bu yüzden soruyu kendi tarzımda ifade edeceğim ... umarım daha açıktır

Yanıtlar:


6

Onları karşılaştıralım

BÖLÜM BOYUTU

Aşağıdakilere sahipseniz:

  • Bir tabloda 100 milyon satır
  • BTREE endeksleme
  • BTREE'deki her Sayfada 1024 anahtar bulunur

Metrikler nasıl olurdu?

LOG (100000000) / LOG (2) = 26.575424759099 olduğundan, sayfa treenode başına 1024 anahtar içeren bir BTREE dizininin ağaç yüksekliği yalnızca 3'tür (CEILING (LOG (100000000) / LOG (1024))). Sadece üç sayfa düğümü ile, erişilen her treenode'da gerekli anahtar için ikili bir arama yaklaşık 30 tuşun budaması ve yalıtılmasıyla sonuçlanır.

BÖLME SAYISI

Aşağıdakilere sahipseniz:

  • Bir tabloda 100 milyon satır
  • BTREE endeksleme
  • BTREE'deki her Sayfada 1024 anahtar bulunur
  • 1024 paritition oluşturuyorsunuz

Sayılar biraz farklı olurdu.

Her bölümün yaklaşık 97656 satırı olmalıdır. Metrikler şimdi ne olacaktı?

LOG (97656) / LOG (2) = 16.575421065795 olduğundan, sayfa treenode başına 1024 anahtar içeren bir BTREE dizininin ağaç yüksekliği yalnızca 2'dir (CEILING (LOG (97656) / LOG (1024))). Sadece iki sayfa düğümü ile, erişilen her treenode'da gerekli anahtar için ikili bir arama yaklaşık 20 tuşun budaması ve yalıtılmasıyla sonuçlanır.

SONUÇ

Anahtarları yaymak yalnızca bir ağaç düzeyini kaldırır, ancak aslında 1024 dizin oluşturur. Sorgular farkı bilemez. Arama süresi muhtemelen en iyi şekilde bölümler lehine nominal olacaktır. Ancak, tüm verilerin etkin olduğundan emin olun. Aksi halde, nadiren erişilen verilere sahip diğer bölümler sadece yer kaplar ve bölümlemeyi haklı çıkaracak kadar sık ​​erişilmez . Endişelenmek için farklı performans metriklerine sahip olabilirsiniz (XFS'de dahili birleştirme , ext3 ve ext4 vb. Gibi) Ayrıca hangi depolama motorunu kullandığınız konusunda da endişelenmeniz gerekir:

  • Kümelenmiş bir dizini yönetmek zorunda kaldığı için InnoDB dizinleme, MyISAM ile karşılaştırıldığında biraz daha karışık olur
  • InnoDB, geçerli günlük dosyasının yanı sıra ibdata1'deki verilerin iki kez yazılmasını sağlar (ib_logfile0 veya ib_logfile1)

1
Teşekkürler, RolandoMySQLDBA, bu çok ilginç. Bundan anladığım şey, bölümlemenin sorgu hızı üzerinde küçük ama kayda değer olumlu bir etkiye sahip olacağı, ancak parçalanma gibi diğer olumsuz etkileri olabileceğidir. Bununla birlikte ilgilendiğim şey, en uygun bölüm sayısını nasıl belirleyeceğidir. Her zaman izin verilen maksimum sayıyı mı kullanmalıyım (yani 1024), yoksa başka bir sayı olumlu ve olumsuz etkiler arasında hoş bir uzlaşma olabilir mi? Yoksa bu tür bir optimizasyonu analiz etmek mümkün değil mi?
robguinness

BTW, bu makale cevabın biraz daha karmaşık olduğunu gösteriyor: mysqlperformanceblog.com/2010/12/11/…
robguinness

Cevap iyidir, ancak anahtarla (veya dizine alınmış alanla) arama yapmakla ilgilidir. Bölümleme konusunda fazla deneyimim yok, ancak veiw açısından tam tabel taraması yapmanız gerektiğinde yararlıdır. Bu durumda, tüm tablo yerine yalnızca birkaç bölümü tararsınız.
Kiraz
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.