2017-09-15 12 views
-1

ORDER BY(< 1秒)を使用せずにクエリが正常に動作します。しかし、それを持つ20代ほどかかります: 私はすべての列sql orderbyは内部自己結合クエリを破棄します

SELECT SQL_NO_CACHE * FROM file_results data 
    INNER JOIN file_result_filters gender ON data.id = gender.file_result_id AND gender.filter = 'filter1' AND gender.value = 'male' 
    INNER JOIN file_result_filters age ON data.id = age.file_result_id AND age.filter = 'filter2' AND age.value > 20 
    INNER JOIN file_result_filters height ON data.id = height.file_result_id AND height.filter = 'filter3' AND height.value > 150 
    ORDER BY age.value DESC 

file_resultsテーブルの上に単一列のインデックスを持っている:

id, ... 

file_result_filters:

id, file_result_id, filter, value 

面白いことは、それがときに動作することです私は3の代わりに2つの内部結合しか持たない

+0

テーブルのサイズはどれくらいですか? – WillardSolutions

+0

まず、そのステートメントのEXPLAINの出力を確認します。 – CBroe

+0

配信されたテーブルを試して、フィルタリングして年齢を指定し、値を注文すると最適な実行が強制される可能性があります。また、実行速度を上げる必要がある複数のcolumnindex(フィルタ、値)が必要です –

答えて

1

理由はMySQLがいつデータを返すことができるかに基づいています。

ORDER BYがないと、MySQLは行が一致するとすぐにデータを返すことができます。結果はすぐに来ているようです。

ORDER BYでは、可能性のあるすべての一致を見つけるためにすべてのデータを処理する必要があります。結果はただちに返されるのではなく、ORDER BYの後にのみ返されます。

もちろん、ORDER BY自体にも時間がかかるため、遅延にも寄与します。

+0

2つの内部結合と順序。私はちょうど私が3番目の – Chris