Büyük veri kümelerindeki analitik sorgular için tüm tabloları taramak başlıca bir darboğazdır. ApsaraDB for SelectDB, gereksiz veri okumalarını en aza indirmek için iki kategori dizin sunar: otomatik olarak oluşturulan ve yönetilen yerleşik akıllı dizinler ile belirli sorgu kalıpları için sizin tanımladığınız ikincil dizinler.
| Kategori | Dizin türleri |
|---|---|
| Yerleşik akıllı dizinler | Zone map dizini, ön ek dizini |
| İkincil dizinler | Ters dizin, Bitmap dizini, Bloom filter dizini, NGram Bloom filter dizini |
Bu konu, yerleşik akıllı dizinlerin çalışma şeklini ve bunlardan en iyi şekilde nasıl yararlanacağınızı ele almaktadır.
Zone map dizini
Zone map dizini, sütun yönelimli depolama biçimindeki her sütun için otomatik olarak oluşturulur ve korunur. SelectDB her sütun için şu bilgileri kaydeder:
Min: Sütundaki en düşük değer
Max: Sütundaki en yüksek değer
NULL count: Sütundaki NULL değerlerin sayısı
Bir sorgu aralık veya eşitlik filtresi içerdiğinde, SelectDB filtreyi her sütunun Min-Max sınırlarıyla karşılaştırır ve hiçbir satırın eşleşme ihtimalinin olmadığı verileri atlar. Bu sayede büyük veri kümelerinde aralık sorguları ve eşitsizlik filtreleri önemli ölçüde daha hızlı çalışır.
Kullanıcı eylemi gerekmez; SelectDB zone map dizinlerini otomatik olarak yönetir.
Ön ek dizini
Ön ek dizininin oluşturulma yöntemi
ApsaraDB for SelectDB, devasa paralel işleme (MPP) mimarisine sahip bir çevrimiçi analitik işleme (OLAP) veritabanıdır. Veriler, sıralı dize tablosuna (SSTable) benzer bir yapıda saklanır: satırlar, tablo oluşturma sırasında tanımlanan anahtar sütunlara göre sıralanır ve depolanır.
Aggregate Key, Unique Key ve Duplicate Key modellerinde satırlar, AGGREGATE KEY, UNIQUE KEY veya DUPLICATE KEY yan tümcesinde listelenen sütunlara göre sıralanır. Ön ek dizini, her satırın anahtar sütunlarının ilk 36 baytını alır ve bunları kısayol arama yapısı olarak kullanır.
Bir kısıtlama geçerlidir: Bir anahtar sütunun türü VARCHAR ise, ön ek dizini 36 bayttan daha az tüketilmiş olsa bile o sütunun sınırında kesilir.
Örnekler
Örnek 1: Ön ek dizini birden çok sütunu kapsar
| Sütun adı | Tür |
|---|---|
| user_id | BIGINT |
| age | INT |
| message | VARCHAR(100) |
| max_dwell_time | DATETIME |
| min_dwell_time | DATETIME |
Bu şema için ön ek dizini user_id (8 bayt) + age (4 bayt) + message (ön ek 20 bayt) = toplam 36 bayttır.
Baştaki sütunlarda filtreleme yapan bir sorgu ön ek dizinine isabet eder ve önemli ölçüde daha hızlı çalışır:
-- Hits the prefix index: user_id is the first key column
SELECT * FROM table WHERE user_id = 1829239 AND age = 20;
İlk anahtar sütununu atlayan bir sorgu ön ek dizinine isabet etmez:
-- Does not hit the prefix index: user_id is not in the filter
SELECT * FROM table WHERE age = 20;
Örnek 2: Ön ek dizini VARCHAR tarafından kesilir
| Sütun adı | Tür |
|---|---|
| user_name | VARCHAR(20) |
| age | INT |
| message | VARCHAR(100) |
| max_dwell_time | DATETIME |
| min_dwell_time | DATETIME |
Bu şema için ön ek dizini yalnızca user_name (20 bayt) değerinden oluşur. user_name VARCHAR olduğundan, yalnızca 20 bayt tüketilmiş olsa bile dizin bu sütundan sonra kesilir. Sonraki sütunlar (age, message) ön ek dizinine dahil edilmez.
Materialized view kullanarak ön ek dizinini değiştirme
Bir tablonun anahtar sütun sırası oluşturma sırasında sabitlenir, bu nedenle bir tabloda yalnızca bir ön ek dizini bulunur. Farklı bir sütun sırasını ve dolayısıyla farklı bir ön ek dizinini desteklemek için sütunları yeniden sıralayan bir materialized view oluşturun. Daha fazla bilgi için bkz. Materialized views.