大家好,我是阿飛云
怕什么真理無窮,進(jìn)一步有近一步的歡喜
記錄一個(gè)MySQL
查詢排序的問題,一個(gè)SQL語句沒有加order by
,那么查詢出來的結(jié)果到底是按照什么規(guī)則排序的呢?查詢了網(wǎng)上的一些資料,分享如下:
?MyISAM 表
MySQL Select 默認(rèn)排序是按照物理存儲(chǔ)順序顯示的(不進(jìn)行額外排序)。也就是說SELECT * FROM tbl – 會(huì)產(chǎn)生“表掃描”。如果表沒有刪除、替換、更新操作,記錄會(huì)顯示為插入的順序。
?InnoDB 表
同樣的情況,會(huì)按主鍵的順序排列,需要再次強(qiáng)調(diào),這只是潛規(guī)則,實(shí)際也不一定完全靠譜的。
參考:MySQL也有潛規(guī)則 – Select 語句不加 order by 如何排序?[1]
如果沒有定義?order by
:
那返回的數(shù)據(jù)不一定是按照主鍵來排序的,結(jié)果可以以任意順序返回 - 也可能隨著時(shí)間而改變。
在關(guān)系數(shù)據(jù)庫中沒有“自然順序”或類似的東西(至少在我所知道的情況下)。獲得可靠排序的唯一方法是顯式指定?order by
子句,來源when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record[2]。
對(duì)于同樣的一批數(shù)據(jù),在某一個(gè)時(shí)刻順序是一樣的,隨著時(shí)間變化,數(shù)據(jù)會(huì)發(fā)生變化,那么在進(jìn)行查詢的時(shí)候,MySQL 會(huì)嘗試以盡可能快的方法(MySQL 實(shí)際的方法不見得快)返回?cái)?shù)據(jù)。
由于訪問主鍵、索引大多數(shù)情況會(huì)快一些(在Cache里)所以返回的數(shù)據(jù)有可能以主鍵、索引的順序輸出,這里并不會(huì)真的進(jìn)行排序,主要是由于主鍵、索引本身就是排序放到內(nèi)存的,所以連續(xù)輸出時(shí)可能是某種序列。在一些情況下消耗硬盤尋道時(shí)間最短的數(shù)據(jù)會(huì)先返回。如果只查詢單個(gè)表,在特殊的情況下是有規(guī)律的。
下面的內(nèi)容分析來源:what-is-the-default-order-of-records-for-a-select-statement-in-mysql[3]
MySQL 中 SELECT 語句的默認(rèn)記錄順序是什么?
里面有一個(gè)認(rèn)可和點(diǎn)贊比較高的回答:
大致解讀一下回答的內(nèi)容,重新發(fā)布一下之前回答過的一個(gè)SQL Server類型的問題。
在 SQL 世界中,順序不是一組數(shù)據(jù)的固有屬性。因此,除非您使用 order by 子句查詢您的數(shù)據(jù),否則您無法從 RDBMS 保證您的數(shù)據(jù)將按特定順序返回 - 甚至以一致的順序返回。
然后回答你的問題:
?MySQL 根據(jù)需要對(duì)記錄進(jìn)行排序,但沒有任何一致性保證?如果您打算依賴此順序進(jìn)行任何操作,則必須使用 order by 指定您想要的順序。否則做任何其他事情都是在為不受歡迎的意外做好準(zhǔn)備。
這是所有 SQL 的屬性,而不僅僅是 MySQL。SQL-92 規(guī)范中的相關(guān)文本是:
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
如果未指定 <order by 子句>,則 Q 的行的順序取決于底層實(shí)現(xiàn)。
本文的內(nèi)容就是如上這些內(nèi)容了,大致總結(jié)一下: 如果在使用沒有指定order by
,那么基本上依賴于底層實(shí)現(xiàn)的,具體排序規(guī)則不定,所以排序的順序也不固定,可能會(huì)隨著時(shí)間發(fā)生變化。
在實(shí)際工作中,如果有查詢列表展示數(shù)據(jù)的功能和需求,開發(fā)前一定要先確定數(shù)據(jù)排序的規(guī)則,這樣可以避免后續(xù)出現(xiàn)數(shù)據(jù)查詢的排序結(jié)果不同的問題。
如果對(duì)MySQL SELECT 語句的默認(rèn)記錄順序有了解或者有研究的伙伴,歡迎留言分享你的理解。
如果文章對(duì)你有所幫助,點(diǎn)贊支持一下,感謝你的慷慨~
References
[1]
?MySQL也有潛規(guī)則 – Select 語句不加 order by 如何排序?:?https://www.cnblogs.com/lushilin/p/6094373.html[2]
?when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record:?https://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record[3]
?what-is-the-default-order-of-records-for-a-select-statement-in-mysql:?https://dba.stackexchange.com/questions/6051/what-is-the-default-order-of-records-for-a-select-statement-in-mysql
推薦閱讀
MySQL數(shù)據(jù)庫設(shè)計(jì)規(guī)范,值得一讀
MySQL數(shù)據(jù)庫之互聯(lián)網(wǎng)常用分庫分表方案文章來源:http://www.zghlxwxcb.cn/news/detail-494992.html
【 一個(gè)人看起來在進(jìn)行邏輯思考,但其實(shí)大多數(shù)時(shí)間只是在進(jìn)行記憶檢索?!?
文章來源地址http://www.zghlxwxcb.cn/news/detail-494992.html
到了這里,關(guān)于MySQL使用SELECT 語句不加ORDER BY默認(rèn)是如何排序的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!