2010-04-08 48 views
5

我有一个巨大的桌子,我想要简单的排序。MySQL排序:NULL到最后&使用索引?不可能?

它可能很容易。我可以创建一个索引,并通过该索引进行一些非常快速的分类。

但我的客户想要将NULL结束,这是复杂的整个情况。

而不是简单:SORT BY name ASC我必须做SORT BY name IS NULL ASC, name ASC。这可以,但是因为我的索引是无用的,排序非常缓慢。

我不知道是否有办法解决这个问题,但如果有的话,我拼命地寻求帮助。 :'(

回答

5

UNION ALL不保证保留记录顺序,但与目前执行的最后ORDER BY只会金额。以单次通过已经有序域:

SELECT * 
FROM (
     SELECT 1 AS source, * 
     FROM user 
     WHERE name IS NOT NULL 
     ORDER BY 
       name 
     ) 
UNION ALL 
SELECT 2 AS source, * 
FROM user 
WHERE name IS NULL 
ORDER BY 
     source, name 

省略最后ORDER BY在未来可能会破坏您的应用程序这是亲在客户端更好地将查询分成两部分的情况下,这种情况非常罕见。

+0

好的,只是一个问题。这是安全的,当你有像1M记录?因为我只是用1M记录来尝试它,而且我总是不得不取消查询,从未达到结果。 难道是第一个查询加载太多,我不应该通过它一些极限? – Vojto 2010-04-08 15:54:56

+0

@Vojto:MySQL在内部缓存内联视图的结果。您最好在客户端使用两个查询。顺便说一句,你真的需要检索所有'1M'记录吗? – Quassnoi 2010-04-08 16:06:07

+0

好吧,我在整个查询的结尾处放了限制,但是当我不对这些子查询设置限制时,它非常缓慢。 – Vojto 2010-04-09 12:33:54

0

使用union首先选择那些记录,名称不为空,然后剩下的

+0

谢谢,这是有道理的,我会尝试它! – Vojto 2010-04-08 13:42:35