1,索引誰實現的
正確的創建合適的索引是提升數據庫查詢性能的 使用b+樹實現
2,索引的定義
索引 是爲了加速對錶中數據行的檢索而創建的一種分散存儲的數據結構
爲什麼要用索引?
索引能極大的減少 存儲引擎需要掃描的數據量
索引 可以把隨機IO 變成順序IO
索引 可以幫助 我們在進行 分組、 排序等操作時,避免使用臨時表
3,爲什麼選擇B+Tree
平衡二叉樹:
缺點:
- 它太深了 數據處的(高)深度決定着他的IO 操作次數,IO 操作耗時大
- 它太小了 每一個磁盤塊 (節點/ 頁) 保存的數據量太小了 沒有很好的利用操作磁盤IO 的數據交換特性,也沒有利用好磁盤IO 的預 讀能力(空間局部性原理 ),從而帶來頻繁的IO
多路平衡查找數B Tree:
加強版多路平衡查找數 B+數:
B+TRee與B Tree的區別:
- B+ 節點關鍵字搜索採用閉合區間
- B+ 非葉節點不保存數據相關信息,只保存關鍵字和子節點的引用
- B+ 關鍵字對應的數據保存在葉子節點中
- B+ 葉子節點是順序排列的,並且相鄰節點具有順序引用的關係
爲什麼選擇B+Tree?
- B+ 樹是B- 樹的變種(PLUS 版)多路絕對平衡查找樹,他擁有B- 樹的優勢
- B+ 樹掃庫、表能力更強
- B+ 樹的磁盤讀寫能力更強
- B+樹 樹 的排序能力更強
- B+ 樹的查詢效率更加
4,B+Tree在兩大引擎中如何體現
Myisam
Innodb
Innodb與Myisam對比
5,索引知識補充
列的離散性
越大離散型越好
離散性越高選擇性就越好 比如性別建索引不太好 選擇性太差還不如全表掃描
最左匹配原則
對索引中關鍵字進行計算(對比),一定是從左往右依次進行,且不可跳過
單列索引:節點中關鍵字[name]
聯合索引:節點中關鍵字[name,phoneNum]
單列索引是特殊的聯合索引
聯合索引列選擇原則:
- 經常用的列優先 【 最左匹配原則 】
- 選擇性(離散度)高的列 優先 【 離散度高原則 】
- 寬度小的列 優先 【 最少空間原則】
覆蓋索引
如果查詢列可通過索引節點中的關鍵字直接返回,則該索引稱之爲覆蓋索引。
覆蓋索引可減少數據庫IO,將隨機IO變爲順序IO,可提高查詢性能
所以纔不讓用select* 被命中索引就不用回表了
索引注意點
- 索引列的數據長度能少則少。
- 索引一定不是越多越好,越全越好,一定是建合適的。
- 匹配列前綴可用到索引 like 9999%, like %9999%、like %9999用不到索引;
- Where 條件中 not in 和 <>操作無法使用索引;
- 匹配範圍值,order by 也可用到索引;
- 多用指定列查詢,只返回自己想到的數據列,少用select *;
- 聯合索引中如果不是按照索引最左列開始查找,無法使用索引;
- 聯合索引中精確匹配最左前列並範圍匹配另外一列可以用到索引;
- 聯合索引中如果查詢中有某個列的範圍查詢,則其右邊的所有列都無法使用索引;
點關注不迷路: