sql >> データベース >  >> NoSQL >> MongoDB

ワイルドカードテキスト検索の高速化

    PostgreSQLクエリプランナーは賢いですが、AIではありません。 式のインデックスを使用するようにするには まったく同じ表現形式を使用する クエリで。

    次のようなインデックスを使用する場合:

    CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));
    

    またはPostgreSQL9.1ではもっと簡単です:

    CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));
    

    このクエリを使用します:

    SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';
    

    これは100%機能的に同等です:

    SELECT * FROM t WHERE lower(a) LIKE 'abcd%'
    

    または:

    SELECT * FROM t WHERE a ILIKE 'abcd%'
    

    しかし、そうではありません

    SELECT * FROM t WHERE a LIKE 'abcd%'
    

    これは機能的に異なるクエリです 異なるが必要です インデックス:

    CREATE INDEX t_a_idx ON t (substring(a, 1, 4));
    

    またはPostgreSQL9.1でより簡単に:

    CREATE INDEX t_a_idx ON t (left(a, 4));
    

    そして、このクエリを使用します:

    SELECT * FROM t WHERE left(a, 4) = 'abcd';
    

    可変長の左アンカー検索用語

    大文字小文字を区別しません。インデックス:

    編集 :ほとんど忘れてしまった:デフォルトの「C」以外のロケールでデータベースを実行する場合は、演算子クラスを明示的に指定します -text_pattern_ops 私の例では:

    CREATE INDEX t_a_lower_idx
    ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);
    

    クエリ:

    SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';
    

    インデックスを利用でき、固定長のバリアントとほぼ同じ速度です。

    このパターンマッチングの詳細については、dba.SEへの投稿 に興味があるかもしれません。 、特に演算子~>=~に関する最後の部分 および~<~



    1. MongoDb:.gzファイルからダンプデータをインポートする方法は?

    2. Django + Mongo+Dockerがpymongo.errors.ServerSelectionTimeoutErrorを取得しています

    3. NestJs/Mongooseの自動インクリメントシーケンス

    4. 集約のための構造の生成