0

私が映画のテーブルを持っているとしましょう:

+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | tinytext            | YES  |     | NULL    |                |
| synopsis   | synopsis            | YES  |     | NULL    |                |
| year       | int(4)              | YES  |     | NULL    |                |
| ISBN       | varchar(13)         | YES  |     | NULL    |                |
| category   | tinytext            | YES  |     | NULL    |                |
| author     | tinytext            | YES  |     | NULL    |                |
| theme      | tinytext            | YES  |     | NULL    |                |
| edition    | int(2)              | YES  |     | NULL    |                |
| search     | text                | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+

この例でsearchは、テーブルの要約として列を使用しています。したがって、可能なレコードは次のようになります。

+------------+-------------------------------------------------------------+
| Field      | Value                                                       |
+------------+-------------------------------------------------------------+
| id         | 1                                                           |
| title      | Awesome Book                                                |
| synopsis   | This is a cool book with a cool history                     |
| year       | 2013                                                        |
| ISBN       | 1234567890123                                               |
| category   | Horror                                                      |
| author     | John Doe                                                    |
| theme      | Programmer goes insane                                      |
| edition    | 2nd                                                         |                        
| search     | 2013 horror john doe awesome book this is a cool book (...) |
+------------+---------------------+------+-----+---------+----------------+

この列searchは、検索が行われたときにスキャンされた列になります。他のフィールドのすべての単語(小文字)と、検索に役立つ追加の単語が含まれていることに注意してください。

私はそれについて2つの質問があります:

1)この列はテキストフィールドであり、非常に大きくなる可能性があることを知っているので、インデックスを作成しても大丈夫ですか?期待どおりにパフォーマンスが向上しますか?なんで?

2)インデックスにもかかわらず、このメソッドを使用して検索するのは良い考えですか、それともクエリのすべての列を試す方が良いですか?どうすれば改善できますか?

OBS:私は実際にはこのテーブルを持っていません、それは単なる例の目的のためです。私が行った可能性のあるデータ型または構文のエラーは無視してください。

4

2 に答える 2

2

1)この列はテキストフィールドであり、非常に大きくなる可能性があることを知っているので、インデックスを作成しても大丈夫ですか?期待どおりにパフォーマンスが向上しますか?なんで?

はい、インデックスを付けることはできますが、いいえ、パフォーマンスは向上しません。文字列型の列のインデックスは、クエリが列の先頭と一致する場合にのみ役立ちます。したがって、この場合、「2013 horror john」を検索する人はインデックスにヒットしますが、「horrorjohn2013」を検索する人はヒットしません。

2)インデックスにもかかわらず、このメソッドを使用して検索するのは良い考えですか、それともクエリのすべての列を試す方が良いですか?どうすれば改善できますか?

Gordon Linoffが書いているように、最善の解決策はおそらく全文検索です。これはテキスト検索では非常に高速で、「あいまい」マッチングを処理し、通常はgoogleの動作と同様の検索関数を記述できます。

于 2013-03-22T15:12:06.387 に答える
1

列のインデックス付けはsearch役に立ちません。

あなたが望むかもしれないのは、あなたがここで読むことができるコラムの全文検索機能です。

検索にどちらを使用するかは、検索でコンテキストを使用するかどうかによって異なります。誰かが「クリントン」を検索した場合、検索を「クリントン」という名前の著者に限定しますか、それとも「クリントン」に関する本に限定しますか?コンテキストを気にしない場合は、1つのフィールドの全文が非常に合理的です。

追加する必要があります。全文検索を使用するために、すべての検索用語を別のフィールドに入力する必要はありません。複数の列に全文索引を作成できます。これにより、コンテキストあり(特定の列のみを検索)またはコンテキストなし(すべての列を検索)で全文検索を使用できる柔軟性が得られます。あなたの質問はsearch特にコラムについてでしたが、それはあなたが探している機能を実装するための最良の方法ではありません。

于 2013-03-22T14:59:38.827 に答える