索引---B+Tree
1.索引的介紹
- MySQL 索引:是幫助 MySQL 高效獲取數據的一種數據結構。所以,索引的本質就是數據結構!
- 在表數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式指向數據, 這樣就可以在這些數據結構上實現高級查找算法,這種數據結構就是索引。
- 有索引和無索引的情況比較
- 作用:提高查詢效率
2.索引的分類
<1>按照功能分類
普通索引:最基本的索引,沒有任何限制。
唯一索引:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值組合必須唯一。
主鍵索引:一種特殊的唯一索引,不允許有空值。在建表時有主鍵列同時創建主鍵索引。
聯合索引:顧名思義,就是將單列索引進行組合。
外鍵索引:只有 InnoDB 引擎支持外鍵索引,用來保證數據的一致性、完整性和實現級聯操作。
全文索引:快速匹配全部文檔的方式。InnoDB 引擎 5.6 版本后才支持全文索引。MEMORY 引擎不支持。
<2>按照結構分類
BTree 索引:MySQL 使用最頻繁的一個索引數據結構,是 InnoDB 和 MyISAM 存儲引擎默認的索引類型,
底層基于 B+Tree 數據結構。
Hash 索引:MySQL 中 Memory 存儲引擎默認支持的索引類型。
3.索引的創建/查看/刪除
<1>主鍵和外鍵的創建本質就是索引的創建,會產生對應的索引
查詢student表中的索引 (主鍵列自帶主鍵索引)
查詢db4數據庫中的product表 (外鍵列自帶外鍵索引)
<2>創建索引
-- 1. 創建索引的語法: CREATE [UNIQUE][FULLTEXT] INDEX 索引名稱 [USING 索引類型] ON 表名稱(列名稱....);-- 2. 案例代碼: -- 為 student 表當中的 name 列創建一個普通的索引。 CREATE INDEX idx_name ON student(name); -- 為 student 表當中的 age 列創建一個唯一索引。 CREATE UNIQUE INDEX idx_age ON student(age);<3>查看索引
-- 1. 查看索引的語法: SHOW INDEX FROM 表名稱;-- 2. 案例代碼: 查詢學生表當中,擁有的索引 SHOW INDEX FROM student;<4>添加索引
-- 1. 普通索引 ALTER TABLE 表名稱 ADD INDEX 索引名稱 (列名); -- 2. 組合索引 ALTER TABLE 表名稱 ADD INDEX 索引名稱 (列名1,列名2,列名3....); -- 3. 主鍵索引 ALTER TABLE 表名稱 ADD PRIMARY KEY (主鍵列名稱); -- 4. 外鍵索引 ALTER TABLE 表名稱 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (本表外鍵列名) REFERENCES 主表名稱(主鍵列名); -- 5. 唯一索引 ALTER TABLE 表名稱 ADD UNIQUE 索引名稱(列名); -- 6. 全文索引 ALTER TABLE 表名稱 ADD FULLTEXT 索引名稱(列名);<5>刪除索引
-- 1. 基礎語法 DROP INDEX 索引名稱 ON 表名稱;<6>索引的使用
- 索引創建成功后,再次查詢帶有索引的列,則它的效率會提高【查詢時間變短】
4.索引的原理[面試]
原理: 磁盤存儲 B+Tree
<1>磁盤存儲特點
- 系統從磁盤讀取數據到內存時是以磁盤塊(block)為基本單位的。
- 位于同一個磁盤塊中的數據會被一次性讀取出來,而不是需要什么取什么。
- InnoDB 存儲引擎中有頁(Page)的概念,頁是其磁盤管理的最小單位。InnoDB 存儲引擎中默認每個頁的大小為 16KB。
- InnoDB 引擎將若干個地址連接磁盤塊,以此來達到頁的大小 16KB,在查詢數據時如果一個頁中的每條數據都能有助于定位數據記錄的位置,這將會減少磁盤 I/O 次數,提高查詢效率。
<2>BTree數據結構
特點:每個節點中不僅包含 key 值,還有數據。會增加查詢數據時磁盤的 IO 次數
<3>B+Tree數據結構
特點:非葉子節點只存儲 key 值,所有數據存儲在葉子節點,所有葉子節點之間都有連接指針
好處:提高查詢速度,減少磁盤的 IO 次數,樹型結構較小
<4>原理總結
- BTree樹的所有的節點都保存地址和數據,在檢索/查詢的過程中會讀取到各個節點上的數據,從而產生了很多不必要的IO操作。B+Tree樹的非葉子節點只存儲地址不存儲數據,所有的數據都保存在葉子節點上,在檢索/查詢的過程中對于非葉子節點不會讀取數據,減少了IO操作,所以能提高查詢效率。
5.創建索引的原則
總結
以上是生活随笔為你收集整理的索引---B+Tree的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果怎么设置文件锁(苹果怎么设置文件锁密
- 下一篇: 索引失效的场景(面试)