2012-04-10 55 views
0

当我想按MySQL中的条件排序查询时,如何避免文件排列?如何优化ORDER条件以防止filesort?

ORDER BY (videos_count > 0) DESC, name 

它会更好缓存一个has_videos布尔列以及计数?

+0

http://stackoverflow.com/search?q=[mysql]+filesort – 2012-04-10 02:02:47

+0

你有(video_count,name)的复合索引吗?不确定MySQL是否足够聪明可以使用它(因为函数),但是无论如何你都需要它。 – Thilo 2012-04-10 02:21:30

+0

是的,我有一个复合索引,但我相信在进行比较时,静态索引不会有帮助。 – rxgx 2012-04-10 17:51:35

回答

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'。但是,这两个联合调用需要更多行,并需要进行表扫描才能将所有内容拉到一起。 – rxgx 2012-04-10 17:49:32

+0

它不会将它们作为UNION调用,而是分开,只有第一个,如果需要,第二个,加入应用程序代码。最差的行数应该是相同的(如果只需要运行第一个查询,则行数应该更少)。 – Thilo 2012-04-11 00:20:56

0

从一般意义上说,为了避免使用文件夹,您通常需要点击一个索引 - 为了打索引,通常需要对裸列值进行排序(因为索引是为列创建的, )。

+0

它会给那些video_count> 0的人,但不会按照该组中的姓名排序(它会先按video_count排序)。 – Thilo 2012-04-10 02:20:03

+0

啊,我错过了那一点。在那种情况下,是的,如果你想对两个事物进行排序并且仍然避免使用文件夹,则需要添加另一列。 – Amber 2012-04-10 03:23:54