sql >> データベース >  >> RDS >> Mysql

likeおよびワイルドカードを使用したMySQL検索の最適化

    弦の長さはどれくらいですか?

    それらが比較的短く(例:英語の単語; avg_len =5)、データベースストレージに余裕がある場合は、次のアプローチを試してください。

    • テーブルに保存する単語ごとに、代わりにその単語の可能なすべての接尾辞を取ります。つまり、何も残らなくなるまで最初の文字を削除し続けます。たとえば、valueという単語 与える:
      • value
      • alue
      • lue
      • ue
      • e
    • を保存 データベース内のこれらのサフィックスのうち。
    • LIKE 'alu%'を使用して部分文字列を検索できるようになりました (「値」の一部として「alu」が見つかります)。

    すべてのサフィックスを保存することで、ストレージスペースを犠牲にして、先頭のワイルドカード(インデックスを高速ルックアップに使用できるようにする)の必要性を排除しました。

    ストレージコスト

    単語を格納するために必要な文字数は、word_len*word_len / 2になります。 、つまり、単語ごとに、単語の長さが2次式になります。さまざまな単語サイズの増加の要因は次のとおりです。

    • 3文字の単語:(3*3/2) / 3 = 1.5
    • 5文字の単語:(5*5/2) / 5 = 2.5
    • 7文字の単語:(7*7/2) / 7 = 3.5
    • 12文字の単語:(12*12/2) / 12 = 6

    単語を格納するために必要な行数が1からword_lenに増加します 。このオーバーヘッドに注意してください。大量の冗長データを保存しないように、追加の列は最小限に抑える必要があります。たとえば、単語が最初に見つかったページ番号は問題ないはずですが(unsigned smallintと考えてください)、単語の広範なメタデータは、接尾辞ごとではなく、単語ごとに別々のテーブルに保存する必要があります。

    考慮事項

    「単語」(またはフラグメント)を分割する場所にはトレードオフがあります。実際の例として:ハイフンで何をしますか?形容詞five-letterを保存しますか 一言か二言で?

    トレードオフは次のとおりです。

    • 分割されたものはすべて、単一の要素として見つけることはできません。 fiveを保存する場合 およびletter 別途、five-letterを検索します またはfiveletter 失敗します。
    • ではないもの 分割すると、より多くのストレージスペースが必要になります。ストレージ要件は、単語の長さが2乗で増加することを忘れないでください。

    便宜上、ハイフンを削除してfiveletterを保存することをお勧めします。 。 fiveを検索すると、単語が見つかります。 、letter 、およびfiveletter 。 (検索クエリからもハイフンを削除しても、ユーザーはfive-letterを正常に見つけることができます。 。)

    最後に、オーバーヘッドをあまり発生させない接尾辞配列を格納する方法がありますが、それらがデータベースに適切に変換されるかどうかはまだわかりません。



    1. レコードへの変更の履歴を追跡するためのMySQLオプション/機能はありますか?

    2. MySQL、MariaDB、Percona Server、MongoDB、またはPostgreSQLのデプロイ-ClusterControlで簡単に

    3. フロートの不整合の平均

    4. SQLServerでDELETEパススルークエリを実行する方法