Neden bölüm DEĞİL?


10

Ne zaman bir veritabanı bölümlemek istemez? ( MySQL bölümlemeyi düşünüyor )

Benim durumumda

  • Birkaç milyon satırla başlayacağım, oradan büyümeli.
  • En sık sorgu kısıtlaması görevi gören bir karakter alanındaki birincil anahtar (ve aramalar sık ​​- saniyede en az birkaç kez).
  • Birincil anahtar, bölüm anahtarı görevi görecek şekilde özetlenir
  • Yukarıda belirtilen sık sorgularda çekilen her satıra güncellemeler yapılacaktır
  • Daha az sıklıkta aramaların (tarih sütunlarına veya diğerlerine karşı) tüm bölümleri vurması gerekir

Son nokta için bile, arama paralel olarak çalışmaz, bu yüzden her durumda, bu bir kazanç mı? Bölümlemenin dezavantajları nelerdir? Neden en azından bir milyondan fazla kayda baktığınızda, HERKES'in varsayılan olarak kullandığı bir şey olmasın?

GÜNCELLEME - zgguy'un cevabını seçtim, ancak kendi araştırmamın sonuçlarına, benim için çok yararlı olan benzer bir soruya gerçekten iyi bir cevaba bir bağlantı da dahil olmak üzere kendi cevabımı eklediğimi not ettim.

Yanıtlar:


5

Performans sorunları için gümüş mermi yoktur ve bölümleme de değildir.

Her bölüm aslında kendi için bir tablodur. Bu nedenle, veritabanının yalnızca bir bölümdeki satırları aramasını sağlayacak şekilde yazılan sorgular daha hızlı hale gelir. Fark, tüm büyük tabloyu taraması gereken sorgular için çok büyük olabilir, ancak kendilerini bölümlenmiş tablodaki yalnızca bir bölümü taramakla sınırlayabilir. Benzersiz tuş aramaları için fark çok daha küçüktür.

Ancak, dizin aramalarını veritabanının tablo (dizin) bölümlerinin tümünü veya çoğunu ziyaret etmesini gerektiren şekilde kullanan sorgular oldukça yavaş çalışır.

Paralel yürütme kendisi için bir konudur. Bir gecede büyük gruplar çalıştırırsanız ve tüm makineyi bu tek işi yapmak için varsa, paralelleştirme iyi bir şeydir. Ancak, veritabanının sürekli olarak birçok eşzamanlı kullanıcının sorgularını sunduğu bir OLTP sisteminde, bir kullanıcının tüm kaynakları almasını istemezsiniz.


Yani benzersiz / birincil anahtar aramaları aslında PK endeksi daha hızlı olduğu için çok fazla gelişme görmez mi? Bu yönetim kurulu genelinde mi - bir PK endeksinin yavaş olduğu zamanlar var mı? Daha yeni eklenen PK'lara aramalar eğilirse ne olur? Çoğu etkinliğin yalnızca bir bölüme çarpmasına neden olan PK'ye dayanan bir bölüm (bölüm anahtarı algo'nun modül veya benzeri olması ve karma olmaması gerekir mi?)
chell

Birincil / benzersiz anahtar aramaları en iyi şekilde küçük bir performans artışı görecektir. Öte yandan, hedefiniz DML ifadelerinin çekişmesini azaltmaksa, DML'nin birkaç bölüme odaklanmak yerine tüm bölümlere eşit olarak dağıtılması için bir şekilde bölümlemeniz gerekir.
zgguy

10 gün sonra geri geldiğim için üzgünüm, ama önemli bir noktaya değiniyorsun - Bölümlemeyi muhtemelen gerekli görmemek için iyi bir sebep verdin, ancak benim senaryom okunduktan sonra (saniyede birkaç) her kaydı güncellemeyi içeriyor. Yazma yükünün yayılması için bu kadar çok yazma ihtiyacı bölümler (eşit dağılımlı) için daha ikna edici bir durum mu oluşturuyor?
chell

Ayrıca (daha yavaş) birçok bölümleri vurmak sorguları hakkında yorumunuzu anlamaya çalışıyorum. Sorgular, bölüm anahtarı olarak da kullanılan (karma) PK'ye karşı ise, DB, arama karmasına dayalı olarak hangi bölüme gidileceğini hemen bilmiyor mu? Yardım için teşekkürler!
chell

Üzgünüz, son zamanlarda yığın değişimini ziyaret edemedik. Bağlantı kurduğunuz cevap harika. Her iki soruya da cevap verdiğine inanıyorum.
zgguy

2

Buradaki cevap iyi yazılmıştır ve zgguy'un cevabına benzer argümanlar yapar , bölümleme size en sık aramaların birincil anahtar veya benzeri bir şeye dayalı olduğu tek makineli bir senaryodan çok fazla fayda sağlamaz. endeksli aramalar da aynı hızda olmalıdır).

Aslında, ortak bir tavsiye dizisi, bölümlemenin ana nedeninin teğetsel ve çoğunlukla yönetim ile ilgili olduğu gibi görünmektedir: örneğin, eski kayıtları sık sık temizlemeniz gerekiyorsa verilerinizi tarihe göre ayırın. Verileriniz, tüm sorguların çoğu yalnızca son eklenen kayıtları vuracaksa, bunun arama performansınıza da fayda sağlayabileceği belirtilmiş olsa da.

Ayrıca MySQL'in asla paralel bir şey yapmadığını da gördüm (bazı bağlantıları veya bunun hakkında daha fazla açıklama görmek güzel olurdu).

Yazma etkinliğinin farklı noktalar ekleyip eklemediğini kimsenin konuştuğunu görmedim.


Yazının Cevabını değiştirdiğini sanmıyorum. Bulduğum 4 kullanım durumundan 2'sinden bahsettiniz. 8.0'da bile hala paralellik yok.
Rick James

1

Akla ilk gelen şey budama budamasıdır ; bu sorgularınızın kullanabileceği bir şey değilse.

Bölümleme size yardımcı olacağı için tablodan büyük miktarda veriyi temizlemeye ihtiyacınız olacak mı? Eski olmasına rağmen , Peter'ın bu yazısında dikkate alınması gereken birkaç nokta var.

ve aklınıza gelebilecek başka bir şey basit tablolar için kullanım kolaylığı ... bölümleme ek iş ve bakım gerektirir.


Daha yeni sürümlerde, sorguyu bir bölümle açıkça sınırlamak için bir sözdizimi vardır. Bunu kullanmak için geçerli bir neden düşünemiyorum.
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.