MySQL性能優化(三)– 索引

  • 2019 年 12 月 5 日
  • 筆記

一、什麼是索引及索引的特點

索引是一種數據結構

索引的特點:查找速度快,排好序,數據結構

索引的數據結構類型有:BTREE索引和HASH索引,下面展示的是BTREE索引。

BTREE:balance tree (平衡樹)

BTREE的特點實例:

假設有一張表,表中的數據為下圖中的左側,則索引中數據為下圖中的右側:

如果查詢id為9,name為ii的,在表中需要查詢9次,但是在二叉樹中需要查詢3次。

二、索引的「類型」

1.聚集索引:節點就是數據本身,即索引表中存的就是數據本身

2.非聚集索引:節點仍然是索引節點,只不過有指向對應數據塊的指針,上面所說的BTREE索引就是非聚集索引

聚集索引的速度比非聚集索引快。

三、索引的類型

1.單列索引(一個索引只包含一個列,一個表可以有多個單列索引)

1-1.主鍵索引:primary key

創建主鍵索引,有兩種方式,其中t1和t2位表名,id為列:

1)建表的時候創建:create table t1 (id int primary key);

2)通過alter語句:alter table t2 add primary key(id);

1-2.普通索引:index,最基本的索引

創建普通索引:

(1)create index 索引名 on 表(列),

例如:create index idx_id on t3(id);

(2)通過alter語句:alter table t4 add index(id);

1-3.唯一索引:unique

創建唯一索引:

(1)建表的時候創建:create table t5 (id int unique);

(2)create unique index 索引名 on 表(列),

例如:create unique index idx_id on t5(id);

注意:unique的欄位可以為null,也可以重複,「」不可以重複出現。

1-4.全文索引:fulltext

資料庫自帶的全文索引,對中文支援不友好,可以藉助第三方的框架,如:sphinx(斯芬克斯)、coreseek

2.多列索引(組合索引,一個組合索引包含兩個或兩個以上的列)

創建:create index idx列名1列名2 on 表名(列名1,列名2)

實例:

建表:create table student(id int,name varchar(20),address varchar(20),remark varchar(20));

建組合索引:create index idxnameaddress_remark on student(name,address,remark);

查詢sql是否使用到了索引,可以使用explain進行分析,後續會給出介紹。

在使用查詢的時候遵循mysql組合索引的「最左前綴」,where時的條件要按建立索引的時候欄位的排序方式,下面都是基於多列索引講述的:

1、不按索引最左列開始查詢

(1) where address='深圳' 不會走索引  

(2)where address = '深圳' and remark='程式設計師' 不會走索引  

2、查詢中某個列有範圍查詢,則其右邊的所有列都無法使用查詢(多列查詢)

where name='xbq' and address like '%深%' and remark='程式設計師' ,該查詢只會使用索引中的前兩列,因為like是範圍查詢

3、查詢中第一個索引欄位出現like '%xxx%'或者'%xxx',不會走索引

4.查詢中多條件用or連接,此類型和1相似

那麼對於索引怎麼刪除呢?刪除索引:alter table 表名 drop index 索引名稱

查詢索引有兩種方式:

  • show index from t1;
  • show keys from t1;

四、索引的優點和缺點

優點:

1.可以通過建立唯一索引或者主鍵索引,保證資料庫表中每一行數據的唯一性.

2.提高檢索速度,降低磁碟讀取IO

索引是排序好的,不需要進行全表掃描,降低了數據排序的運算成本,也就是降低了CPU的消耗

缺點:

1.索引也需要存儲,所以也需要空間,實際上索引也是一張表,保存了索引欄位的值和指向實體表的指針

2.降低更新(增刪改)表的速度,更新不僅僅只是數據本身,如果數據正好是索引欄位,同時需要更新索引資訊

當索引欄位對應的數據改變了,則索引表也會改變,例如,當圖書館中 的書櫃和書,書的類型為科普類,書柜上的目錄也是科普類,

當此書櫃中的書改變了位置的時候,則對應的書櫃的目錄表也要改變。