Mysql總結之索引

MySQl索引

1,索引的概念

  在關係數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列 或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。

  目的:提高查詢的效率

2,索引的用法
創建索引

單列索引

create table user (id int primary key,name varchar(20),age int,index(name));
create index name_index on user(name);
      

在這裏插入圖片描述

聯合索引

create table user1(id int primary key,name varchar(20),age int,index(name,age));
create index name_age_index on user1(name,age);

在這裏插入圖片描述
刪除索引

drop index index_name on user;

在這裏插入圖片描述

3、索引的種類

1、primary key 主鍵索引
2、Unique 唯一性索引
3、Create index 單列索引/多列索引

4,索引的使用

explain(+SQl語句):查看查詢語句的查詢計劃

在這裏插入圖片描述

Id:代表着表的查詢順序

Select_type:顯示的是select語句的訪問類型(子查詢、連接查詢…)

Table:牽扯到的表名

Type:顯示的是訪問類型,null代表最壞情況。

Possible_keys:可能會用到的索引

Key:查詢時用到的索引

Key_len:索引的長度

Rows:影響了幾行

Extra:其他備註信息(是否使用了臨時表,是否使用了外部排序)

連接查詢使用索引

內連接:小表進行全部掃描,大表根據索引直接去找

外連接:左連接時最好給右表加索引,右連接給左表加索引。

表中有多個索引的話:

可以強制指定使用某個索引

例:select * from xxx  FORCE INDEX(IX_addtime);

索引使用的注意事項:

要使用聯合索引,一定要先使用聯合索引的第一個字段
給經常作爲where過濾條件的字段和分組排序字段創建 聯合索引
一般給區分度高的字段創建索引
varchar(200) create index desc_index on table product(desc);尤其是對於字符串類型的字段,創建索引的時候,可以先指定索引的長度,只用字符串的一部分來創建索引數據就可以了
多表join,先按個表的查詢條件比較那個開銷小,從小表中取出所有符合條件的,在大表查

不能使用索引的情況

Like通配符放在最前,不能用索引
對列用函數運算,不能用索引
數制轉換不能用索引
Or、not in、!=、<>不能用索引

5,索引的底層結構

(以InnoB存儲引擎支持的B+樹索引爲例)

一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產生磁盤I/O消耗,相對於內存存取,I/O存取的消耗要高几個數量級,所以評價一個數據結構作爲索引的優劣最重要的指標就是在查找過程中磁盤I/O操作次數的漸進複雜度。

在這裏插入圖片描述

在我們的系統底層,是分爲這三個部分的,我們一般進行Io操作時,用戶空間通過操作系統來操作計算機硬件中的磁盤來讀取數據的。磁盤一般是通過磁盤塊來 傳遞數據,而操作系統中是通過page爲單位來分配內存的。

B樹與B+樹的區別

數據庫系統的設計者巧妙利用了磁盤預讀原理,將一個節點的大小設爲等於一個頁,這樣每個節點只需要一次I/O就可以完全載入。爲了達到這個目的,在實際實現B-Tree還需要使用如下技巧:每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁裏,加之計算機存儲分配都是按頁對齊的,就實現了一個node只需一次I/O。

B樹

在這裏插入圖片描述

B+樹

在這裏插入圖片描述

區別

1、B-樹節點上不僅要存索引值,還存儲索引值所在行的記錄;而B+樹非葉子節點存的全部都是關鍵字(索引值),只有葉子節點上,存儲了索引值以及對應的記錄。
2、B+樹索引關鍵字,都會出現在葉子節點上,非葉子節點只存關鍵字,意味着,所有的記錄都在葉子節點上存儲, 所有記錄搜索的時間是平均的
3、B+樹的層數要比B-樹低一些,所以搜索的時間會更快
4、B+樹把所有葉子節點都串在了一條鏈表結構上

我們所用到的索引它的底層是一顆B+樹

在這裏插入圖片描述

B+樹是爲磁盤或其他直接存取輔助設備而設計的一種平衡查找樹,在B+樹中,所有記錄節點都是按鍵值的大小順序存放在同一層的葉節點中,各葉節點指針進行連接。

查詢B+樹索引的流程

首先通過B+樹索引找到葉節點,再找到對應的數據頁,然後把數據頁加載到內存中,通過二分查找Page 中的槽,查找出一個粗略的目錄,然後根據槽的指針指向鏈表中的行記錄,之後再鏈表中依次查找。

B+樹索引的分類

主鍵索引
主鍵索引是按每張表的主鍵構造的一顆B+樹,並且葉節點存放着整張表的行記錄數據。

InnoDB引擎在組織索引和數據時,就是通過聚簇索引檢索具體Data Page。這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵。在InnoDB引擎中每一個葉子節點都是一個Page信息,構成鏈表結構後就可以檢索每一個Page的上一個Page和下一個Page信息,這恰好也是InnoDB引擎中預讀功能的實現基礎。

在這裏插入圖片描述

只需要將主索引B+樹的非葉子節點加載到內存中。當檢索請求需要讀取某一個具體的Data Page時,再從磁盤上進行讀取。

輔助索引
非聚族索引首先也是一顆B+樹,只是非聚簇索引的葉子節點不再關聯具體的Data Page信息,而是關聯另一個索引值。InnoDB引擎下工作的每一個數據表雖然都只有一個聚簇索引,那就是它的主索引。但是每一張數據表可以有多個非聚簇索引,而後者的葉子節點全部存儲着對應的數據主鍵信息

在這裏插入圖片描述

聚集索引與非聚集索引

1、聚集索引(數據和索引在一個文件中)
2、非聚集索引(數據和索引獨立存放)

一般我們執行這個語句

Select age from user where name = ‘哈哈’;

假設我們給name設置了索引。Id爲這個表的主鍵

在這裏插入圖片描述

首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

6,MYSQL存儲引擎

MySQL存儲引擎 => 表的存儲方式 *.frm(表的結構) D(表的數據) (索引)

InnoDB (B+樹索引結構)

1、支持外鍵
2、支持事務
3、支持並法操作的鎖級別是 =》 行鎖 =》 鎖的粒度小 =》 併發能力強 =》會產生死鎖
4、它支持的索引是聚集索引(數據和索引是在一個文件中存儲的)InnoDB的數據文件本身就是索引文件,表數據文件本身就是按B+Tree組織的一個索引結構

user.frm user.ibd

1、B+樹索引結構
2、InnoDB要求表必須有主鍵列,如果用戶沒有指定,InnoDB會自動爲該表生成整形類型的主鍵列,目的就是爲了生成主鍵索引樹,讓記錄有地方存儲

得出的優化點

不建議使用過長的字段作爲主鍵,因爲所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大
用非單調的字段作爲主鍵在InnoDB中也不好,因爲InnoDB數據文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數據文件爲了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段作爲主鍵就很不錯了
聚簇索引鍵被更新造成的成本除了索引數據可能會移動,相關的所有記錄數據也要移動

MyISAM

1、它不支持外鍵
2、它不支持事務處理
3、支持併發操作的鎖級別是 =》 表鎖 =》 鎖的粒度大 =》併發能力弱 =》不會產生死鎖的
4、它支持的索引是非聚集索引(數據和索引是單獨存放的)

                *.frm   *.MYD    *.MYI                      

1、B+樹索引結構
2、MyISAM不要求表必須有主鍵 因爲主鍵索引樹和輔助索引樹存儲方式一樣的

在這裏插入圖片描述
葉子節點存放的是數據記錄的地址

MEMORY

1、 *.frm(表的結構)磁盤上 data和index 內存上
2、 支持哈希索引

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