次のクエリがテーブルデータをコピーするのはなぜですか?
-
10-10-2019 - |
質問
SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY SourceId, ExternalProductId
HAVING cnt > 1
(externalProductid、sourceID、別のフィールド)にインデックスがあります。説明は、インデックスが使用されていることを示しています。これは、説明の「余分な」列に印刷されています。
Using where; Using index; Using temporary; Using filesort
クエリを実行すると、ショープロセスリストを介して表示されます。
Copying to tmp table on disk
このクエリを微調整して、インデックスで適切に機能することはできますか?また、他のプロセスが同時にこのテーブルで作業しているために、得られる結果がわずかに不正確であるかどうかも気にしません。クエリのパフォーマンスを向上させるために分離レベルを変更できますか?
解決
あなたがあなたの列を逆にする場合 GROUP BY
複合インデックスの最初の2つのフィールドの順序に対応するために、複合インデックスをより効果的に使用します。
SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY ExternalProductId, SourceId
HAVING cnt > 1
クエリ実行プレーンは次のようになります 'Using where; Using index'
, 、そして、他のテーブルと他のテーブルによって引き起こされるfilesortの両方を取り除きます GROUP BY
.
あなたはまだ同じ結果を得るでしょうが、それはわずかに異なる順序であるでしょう。
他のヒント
試してみるいくつかのこと:
MySQLは、グループで自動的に並べ替えます。ソートオーダーが気にしない場合は、「nullによる注文」句を追加します。これにより、FilesortとTempテーブルが取り除かれます。
カウント(*)を削除し、ワイルドカードの代わりにインデックス内の列の名前を使用します。
また。あなたのインデックスは何ですか?完全なテーブル作成ステートメントを見せていただけますか?
所属していません StackOverflow