すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for SelectDB:NGram Bloom フィルターインデックス

最終更新日:Jan 27, 2025

LIKE クエリの性能を向上させるために、ApsaraDB for SelectDBサポートします NGram Bloom フィルター インデックスをサポートしています。NGram Bloom フィルターインデックスの効果は、Bloom フィルターインデックスの効果と似ています。 このトピックでは、NGram Bloom フィルターN-Gram ブルーム フィルター インデックスを ApsaraDB for SelectDB

使用上の注意

  • 列に NGram Bloom フィルター インデックスを作成するには、列が次のすべての条件を満たしている必要があります:

    • 列の型は STRING または VARCHAR です。

    • 同じ列に対して NGram Bloom フィルター インデックスと Bloom フィルター インデックスは相互に排他的です。NGram Bloom フィルターインデックスを作成する列には、Bloom フィルター インデックスが作成されていないことを確認してください。

  • クエリで NGram Bloom フィルター インデックスを有効にするには、クエリが次のすべての条件を満たしている必要があります:

    • クエリは LIKE クエリです。

    • LIKE パターンの連続する文字数は、インデックス定義の gram_size パラメーターの値以上である必要があります。

      説明
      • インデックスの作成時に gram_size パラメーターを指定しない場合、デフォルト値 2 が使用されます。

      • インデックスの作成時に gram_size パラメーターを指定した場合、SHOW INDEXES FROM <table_name>; 文を実行して、テーブルのインデックスをクエリできます。

NGram Bloom フィルターインデックスの作成

テーブルの作成時にインデックスを作成する

この操作は同期処理です。テーブルの作成時にインデックスを作成すると、テーブルとインデックスは同期的に作成されます。

構文

CREATE TABLE  [IF NOT EXISTS] [db_name.]<table_name>
(
  <column_definition_list>,
  [<index_definition_list>] 
)
table_properties;

パラメーター

テーブルの作成に使用されるパラメーター

パラメーター

必須

説明

db_name

いいえ

テーブルを作成するデータベースの名前。

table_name

はい

作成するテーブルの名前。

column_definition_list

はい

列定義のリスト。

table_properties

はい

データモデル、パーティション設定、バケット設定などのテーブルのプロパティ。詳細については、「データモデル」をご参照ください。

index_definition_list

いいえ

インデックス定義のリスト。

index_definition_list

テーブルを作成するときに、index_definition[, index_definition][, index_definition]... 形式で複数のインデックスを定義できます。

index_definition の構文

INDEX <index_name>(<column_name>) <index_type> [PROPERTIES("<key>" = "<value>")] [COMMENT '<comment>']

index_definition のパラメーター

重要

オプションパラメーター PROPERTIES に gram_size パラメーターと bf_size パラメーターを指定しない場合、システムは 2 つのパラメーターを自動的に次のデフォルト値に設定します。"gram_size"="2" および "bf_size"="256"NGram Bloom フィルター インデックスの最適なパフォーマンスを提供するために、ビジネス要件に基づいて 2 つのパラメーターを手動で指定することをお勧めします。2 つのパラメーターの指定方法の詳細については、オプションパラメーター PROPERTIES の説明を参照してください。

必須パラメーター

パラメーター

説明

index_name

インデックスの名前。

列名に idx_ プレフィックスを追加してインデックス名を生成することをお勧めします。

重要

インデックス名はテーブル内で一意である必要があります。

column_name

インデックスが作成される列の名前。

重要

1 つの列には、1 つの NGram Bloom フィルター インデックスまたは Bloom フィルター インデックスのみを設定できます。

index_type

インデックスのタイプ。USING NGRAM_BF に設定します。これは、インデックスタイプが NGram Bloom フィルターインデックスであることを指定します。

オプションパラメーター
PROPERTIES

PROPERTIES パラメーターは、インデックスに基づいてデータブロックを分割するかどうかを指定します。PROPERTIES パラメーターの値は、コンマ (,) で区切られた 1 つ以上のキーと値のペアで構成されます。各キーと値のペアは、"<key>" = "<value>" の形式です。

キー

gram_size

データブロックの分割基準となる連続する文字数。

たとえば、このパラメーターを 3 に設定すると、an ngram'an ', 'n n', ' ng', 'ngr', 'gra', and 'ram' に分割できます。

説明
  • このパラメーターの値は、実際のクエリシナリオによって異なります。LIKE パターンの文字列の最小の長さ (2 以上) を使用することをお勧めします。

  • このパラメーターの値が小さい場合は、bf_size パラメーターの値を調整することで Bloom フィルター のバイト数を増やすことができます。これにより、NGram Bloom フィルター インデックスのパフォーマンスが最適化されます。gram_size パラメーターを 3 に、bf_size パラメーターを 1024 に設定することをお勧めします。クエリプロファイルを使用してパフォーマンスを最適化する方法の詳細については、「クエリプロファイル」をご参照ください。

bf_size

Bloom フィルター のバイト数。

単位: バイト。

このパラメーターは、各データブロックのインデックスサイズを決定します。ほとんどの場合、値が大きいほどフィルタリングのパフォーマンスが向上し、ハッシュ衝突の可能性が低くなります。ただし、バイト数が多いほど、インデックスによって消費されるストレージリソースとメモリリソースが増加します。検証テストと最適なパフォーマンスを得るには、このパラメーターを 256 に設定することをお勧めします。

COMMENT

パラメーター

説明

comment

インデックスの説明。

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;

既存のテーブルにインデックスを作成する

この操作は非同期処理です。SHOW ALTER TABLE COLUMN; 文を実行して、インデックスの作成進捗状況をクエリできます。

構文

ALTER TABLE <table_name> ADD INDEX <index_name>(<column_name>) <index_type> [PROPERTIES("<key>" = "<value>")];

パラメーター

パラメーターは、テーブルの作成時にインデックスを作成するために使用されるパラメーターと同じです。

ALTER TABLE test_table ADD INDEX idx_ngrambf2(username) using NGRAM_BF PROPERTIES("gram_size"="2", "bf_size"="512")comment 'username ngram_bf index' 

テーブルに作成されたすべてのインデックスをクエリする

構文

SHOW INDEXES FROM <table_name>;

test_table テーブルに作成されたすべてのインデックスをクエリします。

SHOW INDEX FROM test_table;

NGram Bloom フィルターインデックスを削除する

この操作は非同期処理です。インデックスの削除進捗状況をクエリする方法の詳細については、「転置インデックスに関する情報のクエリ」をご参照ください。

重要

NGram Bloom フィルターインデックスを削除すると、クエリのパフォーマンスが低下します。注意して進めてください。

構文

ALTER TABLE <table_name> DROP INDEX <index_name>;

test_table テーブルから idx_ngrambf インデックスを削除します。

ALTER TABLE test_table DROP INDEX idx_ngrambf;

インデックスの変更進捗状況をクエリする

ALTER 文を実行して、NGram Bloom フィルターインデックスを変更できます。この操作は非同期処理です。次の文を実行して、インデックスの変更進捗状況をクエリできます。

SHOW ALTER TABLE COLUMN;

よくある質問

Q: クエリで NGram Bloom フィルター インデックスが使用されているかどうかを確認するにはどうすればよいですか?

A: クエリプロファイルに基づいて、NGram Bloom フィルターインデックスが使用されているかどうかを確認できます。クエリプロファイルの使用方法の詳細については、「クエリプロファイル」をご参照ください。

Q: 既存のテーブルに NGram Bloom フィルターインデックスを作成するために ALTER 文を実行したときに、次のエラーが報告された場合はどうすればよいですか?

ERROR 1105 (HY000): errCode = 2, detailMessage = NGRAM_BF index for columns (review_body ) already exist.

A: 1 つのテーブルに複数の NGram Bloom フィルター インデックスを作成できます。ただし、これらのインデックスは異なる列に対して構成する必要があります。列に NGram Bloom フィルター インデックスまたは Bloom フィルター インデックスがすでに作成されている場合、その列に別の NGram Bloom フィルターインデックスを作成することはできません。