グループ化速度を向上させる方法
P粉155832941
2023-09-05 10:24:40
<p>30 億行を超える大きなテーブルがあり、クエリの実行に 3 日かかります。 </p>
<p>これは私のクエリです: </p>
<pre class="brush:php;toolbar:false;">フリークエンシーワードに挿入 (単語、頻度、ファイル名)
単語を選択、頻度として count(*)、max(ファイル名)
すべてのWordstempから
単語ごとにグループ化</pre>
<p>基本的に、私のクエリは allwordstemp テーブルから単語ごとにグループ化することであり、頻度 = 1 のときの <strong>ファイル名</strong> を知りたいので、max(filename) を追加しました。 max などの集計関数に含めることができます。頻度 > 1 の場合、ファイル名の値も必要ありません。
どちらのテーブルにも、単語とファイル名に関する 2 つのインデックスがあります。 </p>
<p>allwordstemp テーブル (ファイル名は ID ファイル): </p>
<pre class="brush:php;toolbar:false;">CREATE TABLE `allwordstemp` (
`word` varchar(45) デフォルト NULL、
`ファイル名` int(11) デフォルト NULL、
KEY `idx_allwordstemp_word` (`word`)、
KEY `idx_allwordstemp_filename` (`filename`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
<p>頻度単語テーブル:</p>
<pre class="brush:php;toolbar:false;">CREATE TABLE `frequencywords` (
`word` varchar(45) デフォルト NULL、
`頻度` int(11) デフォルト NULL、
`ファイル名` int(11) デフォルト NULL、
KEY `idx_frequencywords_word` (`word`)、
KEY `idx_frequencywords_frequency` (`frequency`)、
KEY `idx_frequencywords_filename` (`filename`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
<p>選択内容の説明:</p>
<pre class="brush:php;toolbar:false;"> ---- ------------- -------------- -- ---------- ------ --------------- --------------- ----- --------- ------ ------------ ---------- -------- -----
| id | select_type | テーブル | パーティション | タイプ | possible_keys | キー | key_len | ref | 行 | フィルター | 追加 |
---- ------------- -------------- ------------ ------- ---------- ----------------------- ---------- -- --------------------------------------
| 1 | シンプル | allwordstemp | NULL | インデックス | NULL | idx_allwordstemp_word | 138 | NULL | 3487864881 | 100.00 | インデックスの使用 |
---- ------------- -------------- ------------ ------- ---------- ----------------------- ---------- -- - --- ---------------- ---------- ------------- </pre>
<p>クエリを高速化するにはどうすればよいですか? </p>
フィルタは単語やファイル名ではなく、頻度に基づいているようです。そこで、まずすべての単語を頻度別にインデックス付けします。
次に、頻度が整数であると仮定して、次のような WHERE 句を追加します。 リーリー
上記により、さまざまなファイル名に 1 回だけ出現するすべての単語のリストが表示されます。