2009-05-26 14 views
1

私は、最も効率的な方法で別のテーブルの "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サブクエリを考えていましたが、どのように最適化されているのかわかりません。アイデンティティテーブルの前にタスクテーブルに最初に参加する必要があるので、非常に大きく、不一致が多いアイデンティティテーブルを完全にスキャンしていません。

+0

WHERE EXISTSまたはmysqlの他のサブクエリを使用したパフォーマンスの経験から、より有望なアプローチ(サブクエリの最適化がある場合)がある場合、(groupid、identityid)にインデックスを付けることで、 - ) –

+0

私のタスクテーブルのPRIMARYは、すでに同じです(IDごとにタスクグループごとに1つのタスク)ので、かなり効率的です。 – thomasrutter

答えて

1

「SELECT DISTINCT」をmysqlで効率的に使用するだけです。 "IN(...)"を使用するのではなく、テーブルに値を入力して結合する必要があるかもしれません。

+0

私は 'DISTINCT'を使うと 'Using Using temporary table'と表示されます。私の単純化されたテストではまだかなり速いようですが、私に追いつくことができるかなりのオーバーヘッドを追加しませんか? DISTINCTのテンポラリ・テーブルは、高速/メモリー内にありますか? – thomasrutter

+0

変更に注意してください。 Mysqlは一時テーブルを作成するのが好きですが、通常はかなり効率的です。 WHERE EXISTS戦略は、一般的に最も頻繁に行われるクロスサーバ推奨であり、動作するはずです。 (WHERE ... IN(...)はちょうど私を震えるようにします - 通常は自動連合を意味します) – dkretz

0

MYSQLはTOP N構文をサポートしていますか?その場合:

SELECT TOP 1 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) 
+0

SELECTの後にTOP 1の代わりにmysql構文を指定すると、クエリの最後にORDER BY identity.id DESC LIMIT 1を追加することになりますが、TOPまたはLIMITのいずれかでは、質問のリクエスト。 –

0

サブクエリで比較している列がインデックスされている限り、Existsはうまくいくはずです。

私は、存在がjoin-and-group-byより少し上手くいくと思いますが、確かめるために試してみる必要があります。私は十分な性能のものをMySQLで実行しましたが、私の予測が間違っていて、それを試してみる価値があることを知っています。

+0

私は試してみましたが、EXPLAINはタスクテーブルの前にIDテーブルに参加していることを示していました。 ID表内のすべての行に適用されます。これは私が望む順序ではありませんが、私が持っているテストデータが小さいので、これが単なるものであるかどうかは言い難いです。私は大量のデータを調べて調べる必要があります! – thomasrutter

+0

私は、EXPLAINがサブクエリの結合順序をどのように示しているか誤解しているかもしれないと思います... – thomasrutter

関連する問題