2016-12-28 7 views
0

where節の順序付けに問題があります。なぜwhere節がパフォーマンスに影響しますか?

他の質問から、where句の順序はSQLクエリのパフォーマンスに影響しないことがわかりましたが、注文を変更するとクエリパフォーマンスが変化します。

select sql_no_cache idx 
from rr 
where (timestamp >= '2016-11-28' and timestamp <= '2016-12-28') 
    and ((select name from xx where midx=rr.midx) like 'test' 

select sql_no_cache idx 
from rr 
where ((select name from xx where midx=rr.midx) like 'test' 
    and (timestamp >= '2016-11-28' and timestamp <= '2016-12-28') 

テーブルRRよりも速いが、 'IDX'、 'MIDX' と 'タイムスタンプ' なぜ

任意のアイデアにインデックスを持っています?

+1

クエリオプティマイザが完璧ではありませんので。 –

答えて

0

すべての情報が容易に入手された場合、オプティマイザは、最初に行うためにどの部品を決め、その後、WHEREのすべての部分を見ていきます。順序がの場合、意味的にはとなり、順序は無視されます。

実際には最適化を意図した1つのルールは、MATCH...AGAINSTが最初に実行されることです。

しかし、(あなたのような)いくつかの状況では、オプティマイザは、どの部分がより良いかのヒントを持っていません。だから、それはユーザーが一番よく知っていることを期待して元に戻りました。短絡は性能に大きな違いをもたらす可能性があります。

括弧は順序を制御するのではなく、セマンティクスのみを制御します。

(select name from xx where midx=rr.midx) like 'test'EXISTS (SELECT * FROM xx WHERE midx=rr.midx AND name = 'test')に変わる可能性があります。オプティマイザはEXISTS(...)を理解しており、処方よりも優れた仕事をしています。

"テーブルrrには 'idx'、 'midx'、 'timestamp'のインデックスがあります。 - あいまいです。その3つの1列インデックスですか?または3つの3列の複合インデックス? (大きな違いがあります。)これらのが望ましい:

rr: INDEX(timestamp) 
xx: INDEX(midx, name) 
+0

すばらしい答え!私はEXISTSと試してみます。ありがとう! – nolsigan

+0

EXISTSではなくINを使用することをお勧めします。オプティマイザはSEMIJOIN変換を実行し、サブクエリを結合に変換することを選択する可能性があるからです。つまり、SELECT idx FROM rr タイムスタンプ '2016-11-28' AND '2016-12-28' AND midx IN(SELECT midx FROM xx WHERE name = 'test')。 – oysteing

+0

Semijoinの最適化は5.6.10(またはそれ以降)まで追加されていませんでした@nolsigan - どのバージョンを使用していますか? –

0

私が推測しているのは、短絡のためです。基本的には、タイムスタンプ条件がtrueの場合にのみサブ選択が実行されます。

ほとんどの行でタイムスタンプ条件が真である場合、おそらく同じパフォーマンス結果が得られます。

This SO has some info on this.

And also this one, marked as duplicate as the former.

+0

ありがとうございます。もう少し具体的に説明できますか?私は、最初のクエリでタイムスタンプ条件が真である場合にのみサブ選択が実行されることを理解しましたが、2番目のクエリではなぜそうしないのでしょうか?オプティマイザは、節の順序にかかわらず、タイムスタンプでインデックススキャンを実行するように選択してはいけませんか? – nolsigan

+0

「なぜ」は哲学的な問題です。あなたは本当に哲学的な問題を抱えていますか? – Strawberry

+0

ええと。私はそうは思わない。私はちょうど私がSQLクエリを書くか、またはそれが私のために仕事をすることになるオプティマイザを信頼しようとするたびにwhere節を注文する必要があるかどうかを確かめたいです。 – nolsigan

関連する問題