Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:NGram Bloom filtre dizinleri

Son Güncelleme:Oct 08, 2026

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_size değ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.

Not

Dizin oluşturma sırasında belirtilmezse varsayılan gram_size değeri 2 olur.

NGram Bloom filtre dizini oluşturma

Önemli

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

Uyarı

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.