2

部分インデックスは、インデックスを小さくするのに役立ち、INSERT を高速化します。

例えば

  CREATE TABLE wine (
    name VARCHAR(100),
    ...
    INDEX (name(8)));

名前は次のようなものですが、

  シャトー・ムートン・ロートシルト
  シャトー・ムートン・カデ
  シャトー ペトリュス
  シャトー・ラフィット
  シャトー・ラフルール
  ...

この (例) リストでは、Chateau常に表示されます。MySQL は最初の 8 文字に基づいてインデックスを作成します...つまり、インデックスには 1 つのエントリしかありません (Chateau Petrusすべての の検索が順番に行われますChateau)。
(まさにこの場合、最初の単語 ( Chateau) と残りの名前を 2 つのフィールドに分割することは理にかなっていますが、これは重要ではありません)。

フィールドの終わりに基づいて部分インデックスを作成するように MySQL に依頼する方法はありますか?

4

2 に答える 2

0

実際、私はその間に方法を見つけました-少しのプログラミングで:

nameフィールドのみ

  • すべてのnameエントリはDBに逆に保存されます
  • すべてのname検索が逆になります
  • name行の行は、クライアント(ユーザーエージェント)に送信される前に反転されます

たとえばPHPで

  • ...query('INSERT ... name="' . strrev($name) . '"...
  • ...query('SELECT * FROM wine WHERE name="' . strrev($name) . '"');
  • たとえば、の検索%MOUTON%は実際に検索します%NOTUOM%

多少のreverseオーバーヘッドがありますが、データベースで得られる可能性のあるものと比較すると無視できます。

質問は特に純粋なMySQLソリューションを求めていましたが、ソリューションがない場合、これはどの言語でも実行可能な回避策です。これ以上良いものがなければ、数日以内にこの回答を受け入れます。

于 2012-11-11T12:56:29.600 に答える
0

上記の解決策とは別に、MySQL でこれを解決する唯一の解決策は、インデックスを作成する値を明示的に格納することです。(例:nameなしChateau)

于 2012-11-11T14:44:42.867 に答える