質問

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.

あなたはまだ同じ結果を得るでしょうが、それはわずかに異なる順序であるでしょう。

他のヒント

試してみるいくつかのこと:

  1. MySQLは、グループで自動的に並べ替えます。ソートオーダーが気にしない場合は、「nullによる注文」句を追加します。これにより、FilesortとTempテーブルが取り除かれます。

  2. カウント(*)を削除し、ワイルドカードの代わりにインデックス内の列の名前を使用します。

また。あなたのインデックスは何ですか?完全なテーブル作成ステートメントを見せていただけますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top