2011-01-15 19 views
0

私はここに2つの質問がありますが、私はそれらが相互に関係していると思うので、私はそれらを一度に尋ねています。mysqlの複雑なクエリを最適化

私は複雑なクエリ(複数の結合+サブクエリ)を扱っていますが、テーブルも非常に巨大です(このテーブルには約200,000レコード)。

このクエリの一部(LEFT JOIN)は、最初のテーブルのプライマリキーに関連付けられたすべてのレコードのうちセテイン列に2番目に小さい値を持つレコードを見つける必要があります。今の私は、この部分を分離しているとの行に考えて -

SELECT id FROM tbl ORDER BY `myvalue` ASC LIMIT 1,1; 

しかし、唯一の1レコードがテーブル内に存在する場合、それはそのレコードの代わりにNULLを返す必要があり、場合があります。だから私の最初の質問は、これをどのようにクエリを書くのですか?

第2に、インデックスを作成した後でも既にテーブルのサイズと実行時間を考慮すると、上記の部分を達成するために複雑さを増すとクエリ時間に劇的に影響する可能性があることを理解しています。私は

(アプリケーションが上記コラム「myvalue」はそれらの一つである、これらの列で結果をソートするオプションを持っている)ORDER BY句の列の一部を取得する必要がありますので、私は分解できません

が加わり

この問題に近づく方法は何でしょうか?

おかげ

答えて

0

このような何かが

COALESCE(
    (SELECT id FROM tbl ORDER BY `myvalue` ASC LIMIT 1,1), 
    (SELECT id FROM tbl ORDER BY `myvalue` ASC LIMIT 0,1)) 

を働くかもしれないそれは提供されたリストから最初の非ヌル値を選択します。

クエリの複雑さについては、全体を投稿してみてください。

+0

です。ありがとう、トン。また、これを追加した後でクエリのパフォーマンスをある程度向上させることもできました。だから今はそのすべてが良い。 – naiquevin