私は次のクエリを持っています:
select
t.Chunk as LeftChunk,
t.ChunkHash as LeftChunkHash,
q.Chunk as RightChunk,
q.ChunkHash as RightChunkHash,
count(t.ChunkHash) as ChunkCount
from
chunks as t
join
chunks as q
on
t.ID = q.ID
group by LeftChunkHash, RightChunkHash
そして、次の説明表:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t ALL IDIndex NULL NULL NULL 17796190 "Using temporary; Using filesort"
1 SIMPLE q ref IDIndex IDIndex 4 sotero.t.Id 12
「一時的な使用;ファイルソートの使用」に注意してください。
このクエリを実行すると、RAM(おそらく一時テーブルのb / c)がすぐに不足し、HDDが起動し、クエリが遅くなり停止します。
インデックスの問題かもしれないと思ったので、そのような意味のあるものをいくつか追加し始めました。
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
chunks 0 PRIMARY 1 ChunkId A 17796190 NULL NULL BTREE
chunks 1 ChunkHashIndex 1 ChunkHash A 243783 NULL NULL BTREE
chunks 1 IDIndex 1 Id A 1483015 NULL NULL BTREE
chunks 1 ChunkIndex 1 Chunk A 243783 NULL NULL BTREE
chunks 1 ChunkTypeIndex 1 ChunkType A 2 NULL NULL BTREE
chunks 1 chunkHashByChunkIDIndex 1 ChunkHash A 243783 NULL NULL BTREE
chunks 1 chunkHashByChunkIDIndex 2 ChunkId A 17796190 NULL NULL BTREE
chunks 1 chunkHashByChunkTypeIndex 1 ChunkHash A 243783 NULL NULL BTREE
chunks 1 chunkHashByChunkTypeIndex 2 ChunkType A 261708 NULL NULL BTREE
chunks 1 chunkHashByIDIndex 1 ChunkHash A 243783 NULL NULL BTREE
chunks 1 chunkHashByIDIndex 2 Id A 17796190 NULL NULL BTREE
しかし、まだ一時テーブルを使用しています。
dbエンジンはMyISAMです。
一時的な使用を取り除くにはどうすればよいですか。このクエリでfilesortを使用していますか?
根本的な原因を説明せずにInnoDBに変更するだけでは、特に満足のいく答えではありません。さらに、解決策が適切なインデックスを追加することである場合、それは別のデータベースエンジンに移行するよりもはるかに簡単です。
リレーショナルデータベースは初めてです。ですから、私はその解決策が専門家にとって明白なものであることを望んでいます。
編集1:
IDは主キーではありません。ChunkIDはです。IDごとに約40のChunkIDがあります。したがって、テーブルにIDを追加すると、約40行が追加されます。各一意のチャンクには、一意のchunkHashが関連付けられています。
EDIT2:
スキーマは次のとおりです。
Field Type Null Key Default Extra
ChunkId int(11) NO PRI NULL
ChunkHash int(11) NO MUL NULL
Id int(11) NO MUL NULL
Chunk varchar(255) NO MUL NULL
ChunkType varchar(255) NO MUL NULL
編集3:
クエリの最終目的は、ドキュメント間での単語の共起のテーブルを作成することです。ChunkIDは単語インスタンスです。各インスタンスは、特定のドキュメント(ID)に関連付けられている単語です。ドキュメントごとに約40語が存在します。約100万のドキュメント。したがって、結果として得られる共起のテーブルは、(明らかに)作成されている完全な外積一時テーブルと比較して高度に圧縮されています。つまり、完全な外積一時テーブルは1 mil * 40 * 40=16億行です。圧縮された結果のテーブルは、約4,000万行と推定されます。
編集4:
postgresqlタグを追加して、postgresqlユーザーがそのSQL実装でより良い実行プランを取得できるかどうかを確認します。その場合は、切り替えます。