2 回答

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

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