2 回答

TA貢獻1873條經驗 獲得超9個贊
你的意思大概應該是如果列的數量和索引的數量一樣, 掃描索引的速度和全表掃的速度一樣.
但是, 是絕對不一樣的.
簡單的講解釋, 索引是個樹形結構, 每個節點內的數據是有序的, 同一層的節點是有序的, 整個數據結構都有很強的有序性, 所以它不需要遍歷完所有的索引節點就能找到數據, 或者確定沒有目標數據.
有序性加速查找速度, 這個你可以類比二分查找, 二分查找的數據是有序的, 它不需要遍歷數組中所有的節點, 就可以定位到目標數據.
如果對Mysql索引的原理有興趣的話, 你可以看:MySQL索引背后的數據結構及算法原理

TA貢獻1785條經驗 獲得超8個贊
這個問題回答起來感覺有些困難,其一是 MyISAM 和 InnoDB 用的是 B+Tree,不是 B-Tree,所以題圖不太正確;其二是沒有說明 name 是主鍵索引還是普通索引,如果是普通索引,無論是 MyISAM 還是 InnoDB,都是掃描索引性能較好。
現在我們約束一下條件,假設 name 是主鍵,對比掃描全部索引和全部數據的區別,且假定所有數據不在內存中。
MyISAM
MyISAM 引擎使用 B+Tree 作為索引結構,葉節點的 data 域存放的是數據記錄的地址,也就是說,索引和數據是分開的。
因此,掃描整個索引區比數據區性能好
InnoDB
InnoDB 的數據文件本身就是索引文件。在 InnoDB 中,表數據文件本身就是按 B+Tree 組織的一個索引結構,這棵樹的葉節點 data 域保存了完整的數據記錄。這個索引的 key 是數據表的主鍵,InnoDB 表數據文件本身就是主索引。
因此,掃描整個索引區和數據區是一樣的
這篇文章確實不錯 MySQL索引背后的數據結構及算法原理
- 2 回答
- 0 關注
- 609 瀏覽
添加回答
舉報