0

さて、すべての最初の、私の英語で申し訳ありません。ユーザーがブログページなどのテキストを含めることができるテーブルでクエリを実行しようとしています。ユーザーは、HTML形式でコンテンツをデザインできます。私のテーブルでは、次のように保存されています。

Estadísticas<br />
<table border="0">
<tbody>
<tr>
<td>Columna 1</td>
<td>Columna 2</td>
</tr>
<tr>
<td>Columna 3<br /></td>
<td>Columna 4<br /></td>
</tr>
</tbody>
</table>

私はそのユーザーが望むすべてのコンテンツを検索する必要があります。フィールド'texto'(私が使用している)はロングテキストフィールドであり、テーブルはinnodbです。全文検索はmyisamテーブル専用であるため使用できません。私は次のようにクエリを実行しました:

"SELECT * FROM texto WHERE texto like '%$variable%'"

しかし、クエリは非常に遅く、永遠にかかります。テーブルには849のレコードがありますが、それは大きくありません。phpmyadminで同じクエリを作成すると、非常に長い時間がかかります。しかし、この分野には大きな記録があり、いくつかの記録にはビデオhtml、表、画像がありますが、それは上記のようなテキストです。

私は何ができますか???クエリのパフォーマンスをどのように改善できますか?私はあなたのすべての助けに感謝します。どうもありがとう。そしてまた、私の英語でごめんなさい。

4

1 に答える 1

1

残念ながら、現在の構造からこれ以上取得することはできません。クラスター化されたインデックスまたはクラスター化されていないインデックスは、like '%...'クエリを処理できません。最善の解決策は、おそらくデータをフルテキスト検索エンジン(SOLRなど)にエクスポートし、このエンジンを使用してユーザーのクエリを実行することです。別の解決策よりも不可能な場合tokensは、テキストインデックスの役割を果たすテーブルを作成することです。

create table tokens(
  token varchar(100) not null,
  docid int not null references testdo(id),
  constraint PK_tokens primary key (token, docid)
);

ここでdocid、データテーブルを参照します(名前を付けましたtestdo)。

次に、ユーザーのブログ投稿をいくつかの一般的なhtml式でtokens分割してテーブルに入力する必要があります。例:

insert ignore into tokens values
('Estad', 1),
('Columna 1', 1),
('Columna 2', 1),
('Estad', 1);

ignore来る可能性のある重複を黙って無視するキーワードに注意してください。データで満たされたテーブルを使用tokensして、クエリを次のように変更できます。

select * from testdo d 
  inner join tokens t on t.docid = d.id where t.token like 'Col%'

インデックスとキールックアップを使用しているため、実行速度が大幅に向上します。

PS。tokensドキュメント内の特定の単語の出現回数を保持するカウント列を追加することで、テーブルを改善できます。次に、この列で結果を並べ替えて、検索語との関連性をさらに高めることができます。

于 2012-10-12T22:15:23.473 に答える