某天項目中寫了一句排序sql,可是發現每次執行的結果都不一樣,就是排序順序不同。java
select * from table_tmp order by printStatus asc,dealTime desc
查詢了不少資料,也沒找到一個比較確認的理由,只是較多人認爲是因爲緩存的存在。引用一下別人的回答:mysql
根數據庫系統的算法有關,早期版本的算法是天然的多個線程二分法,那個線程先查到知足條件的數據就先輸出出來,這樣就是亂序的,後期通過改進按照主鍵天然排序輸出。若是order by的值相同,通常是按天然排序,就是首個字符的字母或漢字的發音的首字母的s排序。order by的字段天然排序,若是你的order by 字段是resort,resort值相同的狀況下,是可能有兩種結果,一種就是你列出的隨機排序,還有一種就是按主鍵來排序。這個問題不是固定的,還可能跟你的服務器性能都有關係,若是內存足夠大,執行mysql的時候會提供足夠大的緩衝池,也可能會出現另外一種結果。因此頗有多是由於緩存的存在,在mysql客戶端存在緩存,而後每一次查詢都走緩存因此他的順序不會發生改變。然而執行java程序順序不一致,可能就是由於沒有走緩存,每一次都是實時查詢。也許java程序的這種結果自己就具備更多的可靠性。 算法
知道問題的緣由,解決就很簡單了,不是因爲order by後面的值相同纔出現問題嗎,那就再加個排序字段,好比id什麼的;sql
select * from table_tmp order by printStatus asc,dealTime desc,id asc