2 回答

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

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之間的順序是亂的。
添加回答
舉報