2012-04-10 6 views
0

MySQLでクエリを条件別に注文するときに、どのようにfilesortを避けるのですか?ORDER条件を最適化してファイルを防ぐ方法を教えてください。

ORDER BY (videos_count > 0) DESC, name 

has_videos boolean型のカラムと同様に、カウントをキャッシュする方が良いでしょうか?

+0

http://stackoverflow.com/search?q=[mysql]+filesort –

+0

(video_count、name)に複合インデックスがありますか? MySQLが(機能のために)それを使用するのに十分なほど巧妙であるかどうかはわかりませんが、いずれにしても必要になります。 – Thilo

+0

はい、私は複合インデックスを持っていますが、私は静的インデックスが比較を行う際には役に立たないと信じています。 – rxgx

答えて

1

どのように(必要な場合のみ)、その後、少なくとも1曲のビデオで最初のもの、二つにクエリを分割に関する残り:

select * from video_table 
where video_count > 0 
order by name 

そして、あなたがそれらを越えて行く必要がある場合:

select * from video_table 
where video_count = 0 
order by name 
+0

これは、 'video_count> 0'ではなく' video_count!= 0'でうまくいきます。ただし、2つのユニオン・コールは、より多くの行を必要とし、すべてを一緒にするためにテーブル・スキャンが必要です。 – rxgx

+0

UNIONとは別にUNIONとして呼び出すのではなく、最初のUNIONだけを呼び出し、必要に応じて2番目のUNIONをアプリケーションコードで結合します。また、最悪の場合は行数が同じでなければなりません(最初のクエリを実行するだけでよい場合は少なくなります)。 – Thilo

0

一般的に、filesortを避けるためには、一般的にインデックスをヒットする必要があります。インデックスをヒットするには、通常、列の値(インデックスはカラム、 )。

+0

これはvideo_count> 0のものを一番上に表示しますが、そのグループ内では名前でソートされません(最初にvideo_countでソートされます)。 – Thilo

+0

ああ、私はそのビットを逃した。その場合は、両方の項目を並べ替えてファイルを避けたい場合は、別の列を追加する必要があります。 – Amber

関連する問題