SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY SourceId, ExternalProductId
HAVING cnt > 1
(ExternalProductId、SourceId、AnotherField)にインデックスがあります。索引が使用されていることをExplainが示しています。これは、説明の「エクストラ」欄に印字されています次のクエリのコピーテーブルのデータはなぜですか?
Using where; Using index; Using temporary; Using filesort
私はSHOWのPROCESSLIST経由で参照クエリを実行すると:
Copying to tmp table on disk
私はこのクエリは、インデックス上の所定の位置に動作するように微調整することができますか?また、このテーブルで同時に作業している他のプロセスが原因で、結果が多少不正確になっても構わないのですか?クエリのパフォーマンスを向上させるために分離レベルを変更できますか?
あなたはいくつかの誤解があると思います。一時テーブルとは、テーブルからすべてのデータをコピーしてその作業を行うことを意味するものではありません。これは、後で処理するために中間結果を一時テーブルにコピーすることを意味します。テンポラリテーブルには、ExternalProductIDがnullではないレコードとcntカラムが含まれているため、 'HAVING'句を評価できます。次に、トランザクションの分離は一時テーブルとは関係ありません。 – bot403
@ bot403 - DBAと話をしたところ、彼はあなたに同意します。私はあなたのコメントが実際にこの質問に最も良い答えであると信じています。 – ripper234
はい、答えは#1とajrealのインデックス提案の両方であると思います。 – bot403