mysql索引實現原理(即innodb/myisam儲存引擎原理)
innodb與myisam底層實現原理:b+樹
為什麼這兩種儲存引擎都用b+樹來實現底層資料結構?
因為b+樹高度是可控的,一般就是3到5層。查詢的效率高,樹的高度越高,查詢效率越慢。
b+樹特點:只在最末端葉子節點存資料,葉子節點是以雙向鍊錶的形式相互指向的。
聚簇索引和非聚簇索引理解:
聚簇索引:索引節點上儲存了整行資料。innodb的主鍵索引
非聚簇索引:索引節點上沒有儲存整行的資料。
myisam儲存引擎(非聚簇索引)
這裡討論的是myisam的主鍵索引
建立表指定myisam後,資料庫會生成3個檔案:
1、user.myi 索引檔案:表資料檔案中任何索引的資料樹
2、user.myd 資料檔案:表的資料檔案。(由於inndb使用聚簇索引儲存資料,所以沒有這個資料檔案)
3、user.frm(form結構) 資料結構型別:描述表結構的檔案
執行流程:select * from user where id =1
1、檢視該user表的myi索引檔案中有沒有以id為索引的索引樹
2、在id索引樹上通過id值找到相應節點,從而得到節點的資料(葉子節點存的是索引值和資料位址,資料位址指向當前表myd資料檔案具體的哪一行)
3、根據資料位址去myd檔案裡找到對應的資料返回。
innodb儲存引擎(聚簇索引)
這裡討論的是innobd的主鍵索引
建立user表後,指定為innodb儲存引擎會生成2個檔案:
1、user.ibd:索引檔案
2、user.frm:資料結構型別
因為innodb儲存引擎建表預設就是以主鍵為索引,而myisam不會預設指定主鍵和主鍵索引樹;
myisam的主鍵索引樹和普通索引樹存的內容都是當列的值和資料行位址(行號)。
innodb以多塊page的方式儲存資料,不連續;myisam以乙個連續的table儲存資料,myisam索引儲存的是索引列的值和資料的行號。
注:每個page區預設大小=16kb
innodb主鍵索引結構與myisam索引結構最大的區別:
innodb主鍵索引樹葉子節點存的是索引列的值和整行資料,而myisam主鍵索引(或普通索引)儲存的是索引列的值和資料的位址(行號),由於myisam索引存的都是資料的行號位址,所以myisam查詢資料走普通索引也不存在回表的情況。
執行過程:select * from user where name = "james"
1、找到name索引樹(普通索引樹結構:索引列的值和主鍵的值)
2、根據name的值找到該樹下name索引和主鍵的值
3、用主鍵的值去主鍵索引樹葉子節點找到資料並返回
注:其中2到3這個過程稱為回表
理解索引 索引優化
最近有個需求,要修改現有儲存結構,涉及查詢條件和查詢效率的考量,看了幾篇索引和hbase相關的文章,回憶了相關知識,結合專案需求,說說自己的理解和總結。索引結構和資料定位過程 查詢過程和高階查詢 執行計畫詳細介紹 常見優化方法 聯合索引最左字首原則 復合索引遵守 最左字首 原則,查詢條件中,使用了復...
理解索引 索引優化
最近有個需求,要修改現有儲存結構,涉及查詢條件和查詢效率的考量,看了幾篇索引和hbase相關的文章,回憶了相關知識,結合專案需求,說說自己的理解和總結。索引結構和資料定位過程 查詢過程和高階查詢 執行計畫詳細介紹 常見優化方法 聯合索引最左字首原則 復合索引遵守 最左字首 原則,查詢條件中,使用了復...
索引 淺易理解
一 什麼是索引?sql索引有兩種,聚集索引和非聚集索引,索引主要目的是提高了sql server系統的效能,加快資料的查詢速度與減少系統的響應時間 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致。二.注意事項 三 建立索引的原則 1.定義主鍵的資料列一定要建立索引。2.定...