6

VIEW に全文索引を作成することはできますか?

もしそうなら、2 つの列column1column2VIEW が与えられた場合、これを行うための SQL は何ですか?

これを行う理由は、2 つの非常に大きなテーブルがあり、各テーブルの 1 つの列に対して FULLTEXT 検索を実行し、結果を結合する必要があるためです。結果は 1 つの単位として注文する必要があります。

提案?

EDIT:これは、UNION各ステートメントのスコアリングを作成して順序付けする私の試みでした。

(SELECT a_name AS name, MATCH(a_name) AGAINST('$keyword') as ascore 
     FROM a WHERE MATCH a_name AGAINST('$keyword'))
UNION  
(SELECT s_name AS name,MATCH(s_name) AGAINST('$keyword') as sscore 
     FROM s WHERE MATCH s_name AGAINST('$keyword'))
ORDER BY (ascore + sscore) ASC

sscore認識されませんでした。

4

2 に答える 2

3

MySQL では、ビューに任意の形式のインデックスを使用できません。基礎となるテーブルにのみ使用できます。これは、基礎となるテーブルのデータが常に変更される可能性があるため、MySQL はビューから選択したときにのみビューを具体化するためです。1,000 万行を返すビューがある場合、そこから選択するたびにフルテキスト インデックスを適用する必要があり、これには多くの時間がかかります。

完全なインデックス機能が必要な場合は、投稿した SQL スクリプトをそのまま使用し、手動で (またはスクリプトを cronjob で) 両方のテーブルのフルテキスト インデックスを毎晩 (または、使用している場合は 1 時間ごとに) 更新することもできます。そのトラフィックの多い市場)。

于 2011-03-15T16:07:04.727 に答える
1

非効率的かもしれないが仕事を終わらせる一種の醜い回避策は、ビューを基になるテーブルと結合してフルテキスト列にアクセスすることです。

/* join the view with the underlying table, that is used in the view: */
select item.* from items_view as item
left join items as raw_item on raw_item.id = item.id
/* use the `item` from the view as usual: */
where item.foo = 'bar'
/* but use `raw_item` when you need the fulltext index: */
where match (raw_item.content) against ('foo bar')

もちろん、ビューに新しい列を作成してフルテキスト インデックスを付ける必要がある場合、これは適切な解決策ではありませんが、この方法で元のデータにアクセスする必要があるだけで、他の関係のないビューが必要なだけの場合は、操作する場合は、これが適している可能性があります。

于 2020-10-21T17:01:29.990 に答える