Büyük metin sütunlarında yapılan LIKE sorguları genellikle her veri bloğunu okuyan tam taramalar gerektirir. NGram Bloom filtre dizinleri, SelectDB'nin arama deseniyle eşleşemeyen blokları atlamasına olanak tanır; bu sayede G/Ç azalır ve LIKE sorgu performansı artar.
Çalışma biçimi
Bir sütunda NGram Bloom filtre dizini oluşturduğunuzda SelectDB, depolanan her değeri uzunluğu gram_size olan örtüşen karakter dizilerine ayırır ve bunları bir Bloom filtresinde kaydeder. Örneğin, gram_size=3 iken an ngram dizesi 'an ', 'n n', ' ng', 'ngr', 'gra' ve 'ram' belirteçlerini üretir.
Sorgu sırasında SelectDB, LIKE koşulundaki desene aynı belirteçleme yöntemini uygular. Desenden gelen herhangi bir belirteç belirli bir veri bloğunun Bloom filtresinde yoksa o blok tamamen atlanır.
Ön koşullar
NGram Bloom filtre dizini oluşturmadan önce hedef sütunun aşağıdaki gereksinimleri karşıladığından emin olun:
Sütun türü STRING veya VARCHAR olmalıdır.
Sütunda mevcut bir Bloom filtre dizini bulunmamalıdır. Aynı sütunda NGram Bloom filtre dizini ile Bloom filtre dizini birlikte bulunamaz.
Dizinin etkin olduğu durumlar
NGram Bloom filtre dizini yalnızca aşağıdaki iki koşulun da sağlandığı durumlarda sorguya uygulanır:
Sorgu bir LIKE yüklemi kullanır.
LIKE desenindeki ardışık karakter sayısı
gram_sizedeğerine eşit veya ondan büyüktür.
Örneğin, gram_size=3 ise '%ab%' deseni (2 karakter) dizini etkinleştirmez ancak '%abc%' deseni (3 karakter) etkinleştirir.
Dizin oluşturma sırasında belirtilmezse varsayılan gram_size değeri 2 olur.
NGram Bloom filtre dizini oluşturma
PROPERTIES yan tümcesini atlarsanız SelectDB gram_size=2 ve bf_size=256 değerlerini kullanır. En iyi performansı elde etmek için her iki parametreyi de sorgu kalıplarınıza göre açıkça ayarlayın.
Tablo oluştururken (senkron)
CREATE TABLE işleminin bir parçası olarak dizin oluşturmak senkrondur; tablo ve dizin birlikte oluşturulur.
Sözdizimi
CREATE TABLE [IF NOT EXISTS] [db_name.]<table_name>
(
<column_definition_list>,
INDEX <index_name>(<column_name>) USING NGRAM_BF
[PROPERTIES("gram_size" = "<value>", "bf_size" = "<value>")]
[COMMENT '<comment>']
)
table_properties;
Parametreler
| Parameter | Required | Description |
|---|---|---|
db_name |
No | Tablonun oluşturulduğu veritabanı. |
table_name |
Yes | Tablonun adı. |
column_definition_list |
Yes | Sütun tanımları. CREATE-TABLE. |
table_properties |
Yes | Veri modeli ile bölümlendirme ve paketleme ayarlarını içeren tablo özellikleri. Daha fazla bilgi için bkz. Veri modelleri. |
index_name |
Yes | Tablo içinde benzersiz olması gereken dizin adı. idx_ ön ekini sütun adıyla birlikte kullanın (örneğin, idx_review_body). |
column_name |
Yes | Dizinin uygulanacağı sütun. Bir sütunda yalnızca bir NGram Bloom filtre dizini veya Bloom filtre dizini bulunabilir. |
USING NGRAM_BF |
Yes | NGram Bloom filtre dizini türünü belirtir. |
PROPERTIES
| Key | Description |
|---|---|
gram_size |
Sütun değerlerini bölmek için kullanılan belirteç uzunluğu. LIKE sorgularınızdaki minimum desen uzunluğuyla eşleşen bir değer kullanın; minimum değer 2 olmalıdır. Daha küçük bir gram_size daha fazla belirteç üretir ve yanlış pozitif oranını artırır; bunu telafi etmek için bf_size değerini artırın. Çoğu kullanım durumu için gram_size=3 ve bf_size=1024 ayarı iyi sonuç verir. |
bf_size |
Veri bloğu başına bayt cinsinden Bloom filtre boyutu. Daha büyük bir değer yanlış pozitif oranını düşürür ve gereksiz G/Ç işlemlerini azaltır ancak daha fazla depolama alanı ve bellek kullanır. İlk testler için 256 değeriyle başlayın. |
Örnek
CREATE TABLE `test_table` (
`siteid` int(11) NULL DEFAULT "10" COMMENT "",
`citycode` smallint(6) NULL COMMENT "",
`username` varchar(32) NULL DEFAULT "" COMMENT "",
`review_body` varchar(320) NULL,
INDEX idx_ngrambf (`review_body`) USING NGRAM_BF
PROPERTIES("gram_size"="3", "bf_size"="256")
COMMENT 'review_body ngram_bf index'
) ENGINE=OLAP
AGGREGATE KEY(`siteid`, `citycode`, `username`, `review_body`) COMMENT "OLAP"
DISTRIBUTED BY HASH(`siteid`) BUCKETS 10;
Mevcut bir tabloda (asenkron)
Mevcut bir tabloya dizin eklemek asenkrondur. İlerlemeyi kontrol etmek için SHOW ALTER TABLE COLUMN; komutunu çalıştırın.
Sözdizimi
ALTER TABLE <table_name>
ADD INDEX <index_name>(<column_name>) USING NGRAM_BF
[PROPERTIES("gram_size" = "<value>", "bf_size" = "<value>")];
Örnek
ALTER TABLE test_table
ADD INDEX idx_ngrambf2(username) USING NGRAM_BF
PROPERTIES("gram_size"="2", "bf_size"="512")
COMMENT 'username ngram_bf index';
Tablodaki dizinleri görüntüleme
Bir tablodaki tüm dizinleri ve özelliklerini listelemek için aşağıdaki ifadeyi kullanın:
SHOW INDEXES FROM <table_name>;
Örnek
SHOW INDEX FROM test_table;
NGram Bloom filtre dizini silme
NGram Bloom filtre dizini silmek LIKE sorgu performansını düşürür. Dikkatli ilerleyin.
Bu işlem asenkrondur. Silme ilerlemesini kontrol etmek için bkz. Ters dizinler hakkındaki bilgileri sorgulama.
Sözdizimi
ALTER TABLE <table_name> DROP INDEX <index_name>;
Örnek
ALTER TABLE test_table DROP INDEX idx_ngrambf;
Dizin değiştirme ilerlemesini kontrol etme
Tüm ALTER TABLE dizin işlemleri asenkrondur. İlerlemeyi kontrol etmek için aşağıdaki ifadeyi çalıştırın:
SHOW ALTER TABLE COLUMN;
SSS
Bir sorguda NGram Bloom filtre dizininin kullanıldığını nasıl doğrularım?
Sorgunun profilini kontrol edin. Profil, çalıştırma sırasında hangi dizinlerin uygulandığını gösterir. Ayrıntılar için bkz. Sorgu profili.
NGram Bloom filtre dizini eklerken aşağıdaki hatayı aldım. Bu ne anlama gelir?
ERROR 1105 (HY000): errCode = 2, detailMessage = NGRAM_BF index for columns (review_body) already exist.
Bir tabloda birden çok NGram Bloom filtre dizini bulunabilir ancak her dizin farklı bir sütunda olmalıdır. Bir sütun yalnızca bir NGram Bloom filtre dizini veya Bloom filtre dizinini destekler. Önce sütundaki mevcut dizini silin veya yeni dizini farklı bir sütunda oluşturun.