亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

感覺他一定有一個內部的排序機制,這個機制是什么?

感覺他一定有一個內部的排序機制,這個機制是什么?

躍然一笑 2023-04-05 18:14:35
我想到這個問題是從觀察mysql的自然排序狀態引發的,我們用的很多mysql管理軟件,在列出表數據時一般都用的以下代碼SELECT * FROM table_name LIMIT x OFFSET y這個時候沒有指定任何排序字段,那么在mysql內部就應該有一個類似oracle或者pgsql里面sequence id的東西,做為它的默認索引來實現排序之類的東西。但我從來沒看到有人提過mysql有這個玩意。另一個佐證是如果你指定了一個自增id作為主鍵,在我們預想中如果執行上面的語句,主鍵的排序順序應該一致,實際上并不是這樣,雖然大部分是一致的,但是有少部分會打亂。
查看完整描述

2 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

單說MyISAM吧。 MyISAM的數據和索引是分開的,當你執行一個簡單的select *的時候,按照的就是數據在磁盤上的排列順序(你可以把這個順序理解為sequenceid)。 但是必須指出的是,數據空間是會復用的,也就是說當你在插入一行數據的時候,如果前面被刪除的區塊有合適空位,就會放到這空位中。 因此select *并不保證是按照插入順序。 不知道這么說有木有清楚。

查看完整回答
反對 回復 2023-04-07
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

select * from tb limit oo offset xx; 這種查詢是不走索引的,也就是說根本就不排序,結果的順序是你寫入數據的順序。
mysql索引是這樣的。myisam各種沒底線,沒限制,每一個索引葉子節點存索引列值,指向數據在磁盤的地址。innodb,要求每張表有一個聚簇索引,這東西默認是Primary Key,沒有的話就是第一個unique key,再沒有就自己創建一個autoincrement。這個聚簇索引排成一棵B樹,每個葉子是局促的那個字段值,指向整行數據。其他的索引都叫二級索引,存的是索引列值,指向聚簇索引的列值。這些索引單獨存儲,所以不知名道姓的說用他們,他們是不會出來的,尤其是select * 這種操作,反正是要去取出所有的數據的,而且沒要求排序,那么再走一次PK排序,會慢,所以就直接順序讀出來了。
---- 補充 ----
MyISAM的存儲順序就是寫入順序,他是順著一個一個的寫下去的,所以MyISAM查出來的,完全按照寫入順序。innodb的存儲分頁的,每一個page里的數據是按照聚簇索引排序的,但是page之間是無序的,所以會發現,在數據量比較小的時候,會發現查出來的數據其實還是按照聚簇索引的asc排序的,但是數據多了就會出現部分數據混亂,就是因為page之間的順序是亂的。

查看完整回答
反對 回復 2023-04-07
  • 2 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號