B-Ağacı - Karma Tablosu


105

MySQL'de, bir dizin türü bir b-ağacıdır ve bir b-ağacındaki bir öğeye erişim, logaritmik amortize edilmiş zamandır O(log(n)).

Öte yandan, bir karma tablodaki bir öğeye erişim içerdedir O(1).

Veritabanındaki verilere erişmek için neden b-ağacı yerine karma tablo kullanılmıyor?


9
Karma tablolar, aralık sorgularını desteklemez ve işlem sırasında sorunsuz bir şekilde büyüyemez veya daralamaz.
hmakholm, Monica'yı

3
@HenningMakholm Neden aralık sorgularına ihtiyaç duymayan sütunlar için karma oluşturmayasınız?
Pacerier

Yanıtlar:


119

Öğelere yalnızca bir hashtable'daki birincil anahtarlarından erişebilirsiniz. Bu daha hızlı (bir ağaç algoritması ile daha O(1)yerinelog(n) ), ancak (aralıkları seçemezsiniz arasındaki her şeyi xvey ). Ağaç algoritmaları bunu desteklerken Log(n), karma dizinler tam bir tablo taramasıyla sonuçlanabilir O(n). Ayrıca, hash indekslerinin sabit ek yükü genellikle daha büyüktür ( bu, teta gösteriminde bir faktör değildir, ancak hala mevcuttur ). Ayrıca ağaç algoritmalarının bakımı genellikle daha kolaydır, verilerle büyür, ölçeklenir vb.

Karma dizinler önceden tanımlanmış karma boyutlarla çalışır, bu nedenle nesnelerin içinde depolandığı bazı "kümeler" ile sonuçlanırsınız. Bu nesneler, bu bölümün içinde gerçekten doğru olanı bulmak için tekrar döngüye alınır.

Dolayısıyla, küçük boyutlarınız varsa, küçük öğeler için çok fazla ek yükünüz varsa, büyük boyutlar daha fazla taramaya neden olur.

Günümüzün karma tablo algoritmaları genellikle ölçeklenir, ancak ölçeklendirme verimsiz olabilir.

Gerçekten ölçeklenebilir karma algoritmalar var. Bunun nasıl çalıştığını bana sorma - bu benim için de bir gizem. AFAIK, yeniden hashing işleminin kolay olmadığı ölçeklenebilir çoğaltmadan gelişti.

Onun adı Rush - R eplication u nder, S calable H külleme ve bu algoritmalar böylece Rush algoritmaları olarak adlandırılır.

Ancak, karma boyutlarınıza kıyasla dizininizin tolere edilebilir bir boyutu aştığı ve tüm dizininizin yeniden oluşturulması gereken bir nokta olabilir. Genellikle bu bir sorun değildir, ancak devasa-devasa veri tabanları için bu günler sürebilir.

Ağaç algoritmalarının değiş tokuşu küçüktür ve hemen hemen her kullanım durumu için uygundur ve bu nedenle varsayılandır.

Bununla birlikte, çok hassas bir kullanım durumunuz varsa ve tam olarak neye ve yalnızca neye ihtiyaç duyulacağını biliyorsanız, hash indekslerinden yararlanabilirsiniz.


Dizinin yeniden oluşturulması hakkında daha fazla açıklama yapabilir misiniz? Bu, dizin yeniden oluşturulurken x gün boyunca tablonun bu süre boyunca kullanılamayacağı anlamına mı geliyor?
Pacerier

bu, kullanılan veritabanı sistemine bağlıdır. soru yalnızca teorik konuları kapsıyordu. Ortak veritabanı sistemlerinin uygulama detaylarını gerçekten bilmiyorum. ancak genellikle durum böyle olmamalıdır çünkü ikinci indeks ilk hala kullanılırken oluşturulabilir
The Surrican

"Öğelere yalnızca birincil anahtarlarından erişebilirsiniz" - ister birincil anahtar isterse başka bir dizin türü olsun, dizine doğru olan sütunun değerini mi kastediyorsunuz?
Mark Fisher

93

Aslında, aşağıdaki bağlantıya göre MySQL her iki tür indeksi de ya bir hash tablosu ya da bir b-ağacı kullanıyor gibi görünüyor .

Bir b-ağacı ve bir karma tablosu kullanmak arasındaki fark, birincisinin =,>,> =, <, <= veya BETWEEN operatörlerini kullanan ifadelerde sütun karşılaştırmalarını kullanmanıza izin verirken, ikincisi yalnızca = veya <=> operatörlerini kullanan eşitlik karşılaştırmaları .


12
Bu adil değil. En iyi yanıt, en düşük puana sahiptir.
Андрей Беньковский

7
Tam olarak aradığım buydu. Teknik bir analizden çok sorgularımı nasıl etkilediğini önemsiyordum.
Ben Dehghan

Evet! Bu cevap bana en çok yardımcı oldu.
Ron Ross

çok teşekkürler, uzun zaman oldu ama bu cevap da bana çok yardımcı oldu.
Reham Fahmy

14

Hashtable'ların zaman karmaşıklığı, yalnızca yeterince boyutlandırılmış hashtable'lar için sabittir (verileri tutmak için yeterli bölüm olması gerekir). Bir veritabanı tablosunun boyutu önceden bilinmediğinden, bir hashtable'dan en iyi performansı elde etmek için tablonun ara sıra yeniden düzenlenmesi gerekir. Yeniden doldurma da pahalıdır.


2
Reshashing db çevrimiçiyken yapılabilir mi? Yoksa her şeyi yeniden gözden geçirmek için masayı kilitlememiz mi gerekiyor?
Pacerier

1
Pacerier, MySQL karma indeksleri desteklemiyor. Veritabanı hala çevrimiçiyken dizini yeniden düzenlemek teorik olarak mümkündür (eski dizini kullanmaya devam edin, yeni bir dizin oluşturun, bittiğinde yenisine geçin), ancak MySQL uygulanırsa ne yapacağını bilmiyorum karma belirtiler.
Emil Vikström

3
MySQL, hash dizinlerini destekler, değil mi? : dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
Pacerier

Haklı görünüyorsun. Bu benim için haberdi! Gelişmeye ayak uydurmaya çalışmalıyım :-) O zaman sorunuzu yanıtlamakta benden çok daha iyisiniz, ama dediğim gibi: teorik olarak mümkün.
Emil Vikström

Btw, neden "bir btree diske kolayca sayfalanabilir, ancak bir hashtable olamaz" diyorsunuz? Basit bir anahtar araması yeterli olacağına göre, bir hashtable diskte saklanamaz mı?
Pacerier

6

Hashmap'lerin de ölçeklenmediğini düşünüyorum ve tüm haritanın yeniden düzenlenmesi gerektiğinde pahalı olabilir.


0

DB / OS Seç, karma işlemine dayanıyordu ve iyi çalıştı. Verimli seyrek karma tabloları desteklemek için bugünlerde daha fazla bellek ve mütevazı aralık sorgularını desteklemek için fazladan hashing ile, hashing'in yine de yerini alabileceğini söyleyebilirim (bazıları joker karakterler ve normal ifadeler gibi diğer aralık dışı benzerlik eşleştirme biçimlerine sahip olmayı tercih ederdi) ). Bellek hiyerarşileri büyük hız farklılıklarına sahip olduğunda, çarpışma zincirlerini bitişik tutmak için kopyalamayı da öneririz.

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.