私は、最も効率的な方法で別のテーブルの "1つ以上の"行に一致する1つのテーブルからすべての行を選択したいと思います。複数のマッチングタスクがある場合には現在、これは、同じIDを複数回返します(ただし、これら以降をなくすのパフォーマンスの低下があまりにも悪くありません)すぐに別のテーブルの "1つ以上の"一致する行のすべての行を選択
SELECT identity.id FROM identity
INNER JOIN task ON
task.identityid=identity.id
AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)
。私は代わりに、これらのタスクグループの1つまたは複数に一致する各IDごとに1つの行だけを返すようにしたいと思います。DISTINCTまたはGROUP BYよりも効率的な方法があるかどうか疑問に思っていました。
DISTINCTまたはGROUP BYを実行する際の問題は、タスクテーブルがすべてのgroupidの一致についてスキャンされていて、後でテンポラリテーブル(filesortを使用することもあります)によって1つに縮小されることです。私はむしろ、いくつかの短絡評価をしたいと思います。同じアイデンティティーを見つけた後に、それ以降のタスクマッチを追求しないでください。
私はEXISTSサブクエリを考えていましたが、どのように最適化されているのかわかりません。アイデンティティテーブルの前にタスクテーブルに最初に参加する必要があるので、非常に大きく、不一致が多いアイデンティティテーブルを完全にスキャンしていません。
WHERE EXISTSまたはmysqlの他のサブクエリを使用したパフォーマンスの経験から、より有望なアプローチ(サブクエリの最適化がある場合)がある場合、(groupid、identityid)にインデックスを付けることで、 - ) –
私のタスクテーブルのPRIMARYは、すでに同じです(IDごとにタスクグループごとに1つのタスク)ので、かなり効率的です。 – thomasrutter