Cassandra neden yüksek kardinalite sütunlarında bir dizin oluşturmamanızı öneriyor?


10

Cassandra dokümantasyonunda,

Bu durumlarda bir dizin kullanmayın:

  • Yüksek kardinalite sütunlarında, daha sonra az sayıda sonuç için çok sayıda kaydı sorguladığınızdan. Aşağıdaki Yüksek kardinalite sütun dizini kullanma sorunları bölümüne bakın.

Devam ediyor,

Çok farklı değerleri olan yüksek kardinalite sütununda bir dizin oluşturursanız, alanlar arasındaki bir sorgu çok az sonuç için birçok arama yapılmasına neden olur. Bir milyar şarkı içeren tabloda, sanatçıları yerine şarkı yazarlarına (genellikle her şarkı için benzersiz bir değer) bakmak çok verimsiz olabilir. Tabloyu Cassandra yerleşik dizinini kullanmak yerine manuel olarak bir dizin formu olarak tutmak daha verimli olacaktır. Benzersiz veriler içeren sütunlar için, dizinlenmiş bir sütuna sahip olan tabloya ilişkin sorgu hacmi orta ve sabit yük altında olmadığı sürece, kolaylık sağlamak için bir dizin kullanmak bazen iyi performans gösterir.

Ama soruyu asla gerçekten cevaplamıyor: neden verimsiz? "El ile bir dizin formu olarak tabloyu korumak" ne demek hiçbir fikrim yok. Ama sonra bir şekilde kendisiyle çelişiyor "… bazen sorgu hacmi ılımlı olduğu sürece kolaylık sağlamak için bir indeks kullanmak performans açısından iyi ..."

Bu bana PK'yı ne zaman ve nerede yapabileceğimi söylemeye mi çalışıyor? Verimsizlik nedir? Anladığım kadarıyla, bir dizine çarpan bir sorgunun kümedeki her düğümü sorgulaması gerekir ve ardından her düğüm yerel dizininde bir arama yapar ve sonuçlar daha sonra toplanır. Bu, her zaman ağın gecikmesinde ödeme yaptığımız için, pahalı olmamalıdır (her dizin araması oldukça ucuz olmalıdır), çünkü partinin en yavaş düğümünü beklememiz gerekir. Burada bir şey eksik mi?

Ancak, nadiren de olsa, farklı ama neredeyse benzersiz bir özellik tarafından aranması gereken bajillion öğeleri olan bir koleksiyonum varsa… bu uygun bir kullanımdır, değil mi?

¹Every? Çoğaltma, bu çoğaltma faktörü 3 için kümenin 1 / 3'ünü vurabilir anlamına gelirse?

Yanıtlar:


6

Bir Cassandra diziniyle ( yani , birincil anahtarların aksine "ikincil dizin"), her düğümün bir sorguyu yanıtlamak için kendi yerel verilerini sorgulaması gerekir (bkz. Cassandra ikincil indexexes SSS ). Bu dizin ayrıca bir arka plan işlemi kullanılarak da oluşturulur . Bu arka plana aracı endeksinin olabilir (özlüyor anlamında veya yanlış pozitif) isabet açısından yanlış negatifler dönün.

Bu, yüksek bir kardinalite sütununda, bu sütundaki değişiklik oranının ( yani, ekleme / silme) oldukça yüksek olabileceği anlamına gelir. Bu nedenle, bu değişim oranı dizinin arka plan işlemi yoluyla güncellenmesinden daha hızlıysa, bir dizin kullanmak "verimsiz" olur (dizin, uygulama tarafından gerekenden daha fazla iş gerçekleştirir ve bu genellikle yanlış yanıtı alabilir) .

Daha verimli bir yaklaşım, sorgu açısından doğruluğu , ikinci bir muhafaza etmek olabilir tablo , daha çok ikincil indeksi daha. Tablolar, indekslerin aksine , diğer tablolar gibi ele alınır. Bunlar daha uygulamanıza o sorgu sonuçları vermek olasıdır beklemektedir . Dezavantajı, bir tabloyu bir Cassandra "ikincil dizini" karşısında bir dizin olarak tutmanın artık uygulama kısıtlamaları olmasıdır ( yani , uygulama kodunuzun artık bu "dizin" tablosuna satır eklemek / silmek için bilmesi gerekir ve uygulama düzeyinde "mutabakat" yoluyla iki tabloyu senkronize tutmak için).

Bu yardımcı olur umarım!


Bu endeksler bir arka plan işlemi kullanılarak inşa edilmiştir biraz ... çirkin. Yanlış pozitifler kullanıcı tarafından görülebilir, sanırım? (Nasıl olmayacaklarını bilmiyorum.) Hala sorguladığım tek bölüm, "Bu, yüksek bir kardinalite sütununda, o sütundaki değişiklik oranının (yani eklemeler / silinmeler) yüksek olun. " - Bg endeksi oluşturma ile ilgili olarak değişim oranının neden kötü olacağını anlıyorum, ancak yine de yüksek kardinalitenin bununla ne ilgisi olduğunu görmüyorum. (Elbette, düşük kardinalite sütunu bile aynı kaderi çeker, değil mi?)
Thanatos

Evet, düşük kardinalite sütunu aynı kaderi çeker. Düşüncem biraz bulanıktı, itiraf ediyorum. Ben edildi varsayarak yüksek önem düzeyi indeksi değişikliği (böylece daha muhtemel yanlış pozitif / negatif sonuç elde) daha yüksek bir oranı olması daha muhtemel olacaktır; kardinalite değil, en alakalı olan değişim oranıdır (arka plan indeksleme sürecine göre).
Castaglia

2

Bazı terminoloji: Üst tablo, üzerinde bir indeksin oluşturulduğu tablodur. İkincil dizin tablosu, başka bir tabloda bir dizini korumak için oluşturulan tablodur.

İkincil dizin tablosunun verileri, üst tablonun verileri ile aynı düğümde depolanır. Cassandra bölümleyici dizin tablosu verilerini bölümlemez ve dağıtmaz. Dolayısıyla, bir dizin sütununda arama yapmak istiyorsanız, yalnızca verileri içeren çoğaltma düğümleri değil, tüm düğümler sorgulanır. (koordinatör düğümü verinin nerede olduğunu bilmiyor) https://www.datastax.com/dev/blog/cassandra-native-seincil-index-deep-dive

Ssn veya başka bir benzersiz kimlik gibi yüksek kardinalite sütunları için, birincil anahtarla bire bir eşleme olacaktır. Böyle bir sütunda bir dizin oluşturursanız, veriler düğümlerin çoğaltma faktörü sayısı üzerinde bulunur, ancak arama çağrısı tüm düğümlerde yürütülür. En iyi durumda, koordinatör veri içeren düğümlere doğrudan vurur ve Tutarlılık düzeyi karşılandığında, sonucunuzu alırsınız. En kötüsü, aradığınız veriler dizinde yoksa, tüm düğümlerin verilerin orada olmadığını bulmak için yanıt vermesini beklersiniz. Bu nedenle, ikincil bir dizin tablosundaki her arama çağrısı için tüm düğümler vurulur. Tablonun normal bir C * tablosu olması durumunda, her arama çağrısı için isabet edilen düğümlerin çoğaltma faktörü sayısıyla karşılaştırın.

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.