0

私はいくつかの数値列を含むテーブルを持っていますが、ほとんどの場合それから恩恵を受けるので、それらを数値に保つ必要があります。しかし、部分一致を使用してこれらの列で一般的な検索を行う必要もあるため、whereステートメントでは次のようになります。

...where num_col1 like "1234%...

私の質問は:

列をCHARにキャストするnum_col1に関数ベースのインデックスを作成できますか?やってみましたが、出来ないようです。

いいえの場合、クエリの結果を高速化する方法について他に何か提案はありますか?

いくつかの可能な解決策は、元のテーブルのビューを作成し、列タイプをvarcharに変更してその列にインデックスを付けるか、別の解決策として、テーブルにvarchar列を追加してインデックスを付けることです。すでに大量の行と大量の列を含む非常に大きなテーブルがあるため、これらのソリューションの両方を避けたいと思います。

皆さん、ベスト、Nに事前に感謝します。

4

2 に答える 2

2

MySQL には、関数ベースのインデックス、仮想列、またはインデックス付きビュー (私の知る限り) がありません。

SQL Indexing TutorialからMySQL の関数ベースのインデックスに関するメモを引用します。

バックアップの解決策は、式の結果を保持する実際の列をテーブルに作成することです。列は、トリガーまたはアプリケーション レイヤーのどちらか適切な方で維持する必要があります。新しい列は、他の列と同じようにインデックスを作成できます。SQL ステートメントは、新しい列を (式なしで) クエリする必要があります。

ただし、特定のケースでは、どこでも LIKE 式 '%1234%' でフィルタリングする可能性があります。その場合、b ツリーは役に立ちません ( LIKE パフォーマンスのチューニング/インデックス作成で説明されています)。これには、MyISAM でのみ機能するフルテキスト インデックス作成が必要です。

于 2011-03-25T14:00:53.217 に答える
1

データを複製しないようにするために、ビューを使用するというあなたの本能は正しいと思います。しかし、ある場合には数字によって最適化され、別の場合には文字列検索によって最適化されるニーズは何でしょうか? それらによっては、番号付けシステムを調べて、文字列比較よりもはるかに高速な数値範囲 ( x >= 12340 および x < 12350 ) で検索できるかどうかを確認することが理にかなっている場合があります。

于 2011-03-25T13:40:44.703 に答える