次の 3 つのテーブルがあります。
- 表の単語を作成します (id 整数、単語テキスト、freq 整数)。
- 表文 (id 整数、文テキスト) を作成します。
- テーブル インデックスを作成します (wordId 整数、文 ID 整数、位置整数)。
インデックスは逆インデックスで、どの単語がどの文に含まれているかを示します。さらに、表の単語と文から id のインデックスがあります。
このクエリは、特定の単語が出現する文を特定し、最初に一致したものを返します。
select S.sentence from sentences S, words W, index I
where W.word = '#erhoehungen' and W.id = I.wordId and S.id = I.sentenceId
limit 1;
しかし、次のように 2 つの単語が一緒に出現する文を取得したい場合:
select S.sentence from sentences S, words W, index I
where W.word = '#dreikampf' and I.wordId = W.id and S.id = I.sentenceId and
S.id in (
select S.id from sentences S, words W, index I
where W.word = 'bruederle' and W.id = I.wordId and S.id = I.sentenceId
)
limit 1;
このクエリは非常に低速です。高速化するコツはありますか?私がこれまでに行ったことは次のとおりです。
- shared_buffer を 32MB に増やしました
- work_mem を 15MB に増やしました
- すべてのテーブルで分析を実行しました
- 前述のように、単語 id と文 id のインデックスを作成しました
よろしく。
€同上:
Explain Analyst クエリ ステートメントの出力は次のとおりです: http://pastebin.com/t2M5w4na
これら 3 つの create ステートメントは、実は私のオリジナルの create ステートメントです。テーブルの文と単語に主キーを追加し、これらをインデックスの外部キーとして参照する必要がありますか? しかし、インデックス テーブルにはどの主キーを使用すればよいでしょうか。SentId と wordId は一緒に一意ではなく、文内の単語の位置を示す pos を追加しても一意ではありません。
に更新:
- 表の単語を作成します (id 整数、単語テキスト、freq 整数、主キー (id));
- 表文を作成します(id整数、文テキスト、主キー(id));
- テーブル インデックスを作成します (wordId 整数、sentenceId 整数、位置整数、外部キー (wordId) は単語 (id) を参照、外部キー (sentenceId) は文 (sentenceId) を参照);