mysql之索引(一)

1,索引誰實現的

正確的創建合適的索引是提升數據庫查詢性能的 使用b+樹實現

2,索引的定義

索引 是爲了加速對錶中數據行的檢索而創建的一種分散存儲的數據結構

image-20200626224400244

爲什麼要用索引?

索引能極大的減少 存儲引擎需要掃描的數據量
索引 可以把隨機IO 變成順序IO
索引 可以幫助 我們在進行 分組、 排序等操作時,避免使用臨時表

3,爲什麼選擇B+Tree

平衡二叉樹:

image-20200627002159015

缺點:

  1. 它太深了 數據處的(高)深度決定着他的IO 操作次數,IO 操作耗時大
  2. 它太小了 每一個磁盤塊 (節點/ 頁) 保存的數據量太小了 沒有很好的利用操作磁盤IO 的數據交換特性,也沒有利用好磁盤IO 的預 讀能力(空間局部性原理 ),從而帶來頻繁的IO

多路平衡查找數B Tree:

image-20200627002839145

加強版多路平衡查找數 B+數:

image-20200627003139371

B+TRee與B Tree的區別:

  1. B+ 節點關鍵字搜索採用閉合區間
  2. B+ 非葉節點不保存數據相關信息,只保存關鍵字和子節點的引用
  3. B+ 關鍵字對應的數據保存在葉子節點中
  4. B+ 葉子節點是順序排列的,並且相鄰節點具有順序引用的關係

爲什麼選擇B+Tree?

  1. B+ 樹是B- 樹的變種(PLUS 版)多路絕對平衡查找樹,他擁有B- 樹的優勢
  2. B+ 樹掃庫、表能力更強
  3. B+ 樹的磁盤讀寫能力更強
  4. B+樹 樹 的排序能力更強
  5. B+ 樹的查詢效率更加

4,B+Tree在兩大引擎中如何體現

Myisam

image-20200627004211565

image-20200627004249316

Innodb

image-20200627004403622

image-20200627004441573

Innodb與Myisam對比

image-20200627004514813

5,索引知識補充

列的離散性

越大離散型越好

離散性越高選擇性就越好 比如性別建索引不太好 選擇性太差還不如全表掃描

最左匹配原則

對索引中關鍵字進行計算(對比),一定是從左往右依次進行,且不可跳過

image-20200627005635430

單列索引:節點中關鍵字[name]
聯合索引:節點中關鍵字[name,phoneNum]
單列索引是特殊的聯合索引
聯合索引列選擇原則:

  1. 經常用的列優先 【 最左匹配原則 】
  2. 選擇性(離散度)高的列 優先 【 離散度高原則 】
  3. 寬度小的列 優先 【 最少空間原則】

覆蓋索引

如果查詢列可通過索引節點中的關鍵字直接返回,則該索引稱之爲覆蓋索引。
覆蓋索引可減少數據庫IO,將隨機IO變爲順序IO,可提高查詢性能

所以纔不讓用select* 被命中索引就不用回表了

索引注意點

  • 索引列的數據長度能少則少。
  • 索引一定不是越多越好,越全越好,一定是建合適的。
  • 匹配列前綴可用到索引 like 9999%, like %9999%、like %9999用不到索引;
  • Where 條件中 not in 和 <>操作無法使用索引;
  • 匹配範圍值,order by 也可用到索引;
  • 多用指定列查詢,只返回自己想到的數據列,少用select *;
  • 聯合索引中如果不是按照索引最左列開始查找,無法使用索引;
  • 聯合索引中精確匹配最左前列並範圍匹配另外一列可以用到索引;
  • 聯合索引中如果查詢中有某個列的範圍查詢,則其右邊的所有列都無法使用索引;

點關注不迷路:

image-20200625023509017

微信圖片_20200626001332

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章