0

相互にリンクされている一連の MySQL テーブルでキーワード検索をすばやく簡単に実行できるようにしようとしています。

一意の「itemID」を持つアイテムのテーブルがあり、関連付けられたデータは他のテーブルに分散され、すべて itemID を介してリンクされています。

この情報の多くを 1 つの使用可能な形式に連結するビューを作成しました。これにより、検索が非常に簡単になりますが、パフォーマンスは向上しません。これはビューの最初の使用であり、おそらく正しい使用法ではありませんでした。誰かが私にいくつかの指針を与えることができれば、私はとても感謝しています.

簡単な例は次のとおりです。

項目表:

itemID |  name 
------   -------
   1      "James"
   2      "Bob"
   3      "Mary"

キーワード表:

keywordID |  itemID |  keyword
------      -------   -------
   1           2        "rabbit"
   2           2        "dog"
   3           3        "chicken" 

さらに多くの関係...

MY VIEW: (CONCAT_WS、GROUP_CONCAT、およびかなりの数の JOIN を使用して作成)

itemID |  important_search_terms 
------   -------
   1      "James ..."
   2      "Bob, rabbit, dog ..."
   3      "Mary, chicken ..."

次に、ビューで「mary」と「chicken」を検索すると、itemID=3 の一致が簡単に見つかります。素晴らしい!

問題は、効率的ではない検索ごとに CONCAT と JOIN のすべての作業を行っているように見えることです。現在のテスト データの検索では、約 2 秒かかりますが、これは実用的ではありません。

ビューが何らかの方法でキャッシュされることを望んでいましたが、おそらく正しい方法で使用していません。

定期的に更新するこの検索情報を含む実際のテーブルを作成することもできますが、期待したほどうまくいきません。

誰か提案があれば、私はとても感謝しています。どうもありがとう

4

3 に答える 3

1

まあ、ビューは、クエリを読みやすくするだけでなく、その下にある SQL ステートメントを毎回実行します。

したがって、そのステートメント自体を実行するときと同じくらい遅い (さらに遅い...) のも不思議ではありません。

通常、これは索引付けジョブ (夜間に実行され、誰にも迷惑をかけることはありません)、または索引付けされた挿入 (新しいデータが挿入されると、それらを索引付けされた興味深い単語に挿入することをお勧めするかどうかのチェックが実行されます) によって行われます。

実行時にそれを行うのは非常に難しく、適切に設計されたデータベース構造と、ほとんどの場合、SQL サーバー用の強力なハードウェアが必要です (データ量によって異なります)。

于 2012-08-29T18:05:00.770 に答える
1

MySQL ビューは、他の SQL 言語のマテリアライズド ビューと同じではありません。実際に行っているのは、クエリに必要なデータではなく、クエリ自体をキャッシュしていることだけです。

MySQL ビューの主な用途は、何度も書き直さなければならない反復クエリをなくすことです。

于 2012-08-29T18:05:19.960 に答える
1

あなたはそれを簡単にしましたが、速くはしませんでした。クエリの EXPLAIN を見ると、クエリを実行するたびに、MySQL がそのビューをマテリアライズしている (ビュー クエリからの結果セットのコピーを「派生テーブル」として書き出す) ことがわかると思います。次に、その「派生テーブル」からクエリを実行します。

次のように、「検索」述語を各テーブルに対して個別に実行できると、パフォーマンスが向上します。

SELECT 'items' AS source, itemID, name AS found_term 
  FROM items WHERE name LIKE 'foo'
 UNION ALL
SELECT 'keywords', itemID, keyword 
  FROM keywords WHERE keyword LIKE 'foo'
 UNION ALL
SELECT 'others', itemID 
  FROM others WHERE other LIKE 'foo'

-また-

一致した用語が何であるか、またはそれが見つかったテーブルを気にせず、一致した itemID の個別のリストを返したい場合

SELECT itemID
  FROM items WHERE name LIKE 'foo'
 UNION
SELECT itemID
  FROM keywords WHERE keyword LIKE 'foo'
 UNION
SELECT itemID 
  FROM others WHERE other LIKE 'foo'
于 2012-08-29T18:10:25.100 に答える