2010-04-08 57 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