mysql索引總結(2)-MySQL聚簇索引和非聚簇索引


mysql索引總結(1)-mysql 索引類型以及創建

mysql索引總結(2)-MySQL聚簇索引和非聚簇索引

mysql索引總結(3)-MySQL聚簇索引和非聚簇索引

mysql索引總結(4)-MySQL索引失效的幾種情況


 

聚簇索引就是對磁盤上的實際數據重新組織以按照特定的一個或者多個列的值排序的算法

特點是存儲數據的順序和索引順序一致 一般情況下主鍵會默認生成聚簇索引 且一張表有且只有一個聚簇索引

聚簇索引和非聚簇索引的區別是:

聚簇索引(innobe)的葉子節點就是數據節點 而非聚簇索引(myisam)的葉子節點仍然是索引文件 只是這個索引文件中包含指向對應數據塊的指針

MySQL中不同的數據存儲引擎對聚簇索引有不同的支持

MyISAM使用的是非聚簇索引

原始數據

這里寫圖片描述

存儲方式

這里寫圖片描述

按照列值和行號來組織索引的 葉子節點中保存的實際上是指向存放數據塊的指針

從物理文件中也可以看出 MyISAM的索引文件.MYI和數據文件.MYD是分開存儲的 是相對獨立的

對於InnoDB引擎來說,是按照聚簇索引的形式存儲數據

這里寫圖片描述

它的每個聚簇索引的葉子節點都包含主鍵值、事務ID、回滾指針(用於事務和MVCC)以及余下的列。

從物理文件也可以看出 InnoDB的數據文件只有數據結構文件.frm和數據文件.idb 其中.idb中存放的是數據和索引信息 是存放在一起的

InnoDB的二級索引和主鍵索引也有很大的不同 二級索引存放的是主鍵值而不是行指針 減少了移動數據或者分裂時維護二級索引的開銷,因為不需要更新索引的行指針

這里寫圖片描述

MyISAM和InnoDB的二級索引的對比

這里寫圖片描述

從圖中可以看出 InnoDB二級索引的葉子節點存放的是KEY字段+主鍵值,因此首先通過二級索引查找到的是主鍵值,再根據主鍵值在朱建索引中查找到相應的數據文件。

而MyISAM的二級索引存放的還是列值和行號的組合 葉子節點中保存的是指向物理數據的指針,因此它的主建索引和二級索引的結構並沒有任何區別,只是說主鍵索引的索引值是唯一且非空的,而MyISAM引擎可以不設置主鍵。

InnoDB引擎是必須設置主鍵的,需要依賴主鍵生成聚簇索引,因此當沒有指定主鍵的時候,InnoDB引擎會默認尋找一個可以唯一標識每行數據的列作為主鍵,當這種列不存在的時候,會默認生成一個6字節整型的隱藏列作為主鍵

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM