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

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

mysql 數據區某個列的行的數量和索引區的節點如果一樣, 是否掃描數據區和索引區是一樣的效率 ?

mysql 數據區某個列的行的數量和索引區的節點如果一樣, 是否掃描數據區和索引區是一樣的效率 ?

Smart貓小萌 2019-03-07 17:26:13
b-tree 結構如果name字段是索引 , 那么如果表中有7條數據 , b-tree所有節點也是7條數據 , 這樣一來 , 掃描整個數據區 和 掃描整個索引區 效率不是差不多嗎 ? (但是我記得有人說即使掃描整個索引區也比掃描整個數據區好)
查看完整描述

2 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

你的意思大概應該是如果列的數量和索引的數量一樣, 掃描索引的速度和全表掃的速度一樣.

但是, 是絕對不一樣的.

簡單的講解釋, 索引是個樹形結構, 每個節點內的數據是有序的, 同一層的節點是有序的, 整個數據結構都有很強的有序性, 所以它不需要遍歷完所有的索引節點就能找到數據, 或者確定沒有目標數據.

有序性加速查找速度, 這個你可以類比二分查找, 二分查找的數據是有序的, 它不需要遍歷數組中所有的節點, 就可以定位到目標數據.

如果對Mysql索引的原理有興趣的話, 你可以看:MySQL索引背后的數據結構及算法原理


查看完整回答
反對 回復 2019-03-07
?
慕的地10843

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索引背后的數據結構及算法原理


查看完整回答
反對 回復 2019-03-07
  • 2 回答
  • 0 關注
  • 609 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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