MySQL之索引基礎

  • 2019 年 11 月 6 日
  • 筆記

MySQL之索引基礎
索引是應用程序設計和開發的一個重要方面,過多的索引會影響程序的性能,而索引過少又會對查詢性能產生影響,要找到一個合適的平衡點,並不是一件容易的事情。

innodb存儲引擎支持B+樹索引、全文索引以及哈希索引等常見的幾種索引。需要注意的是,Innodb存儲引擎支持的哈希索引是自適應的,Innodb存儲引擎會根據表的使用情況自動為表生成哈希索引。B+樹索引就是傳統意義上的索引,它的構造類似於二叉樹,根據key value鍵值對快速找到數據。

01

索引的優缺點

索引的優點很多,這裡簡單列舉幾條:

(1)使用唯一索引可以保證數據庫表中的每行數據的唯一性;

(2)可以大大加快數據的查詢速度;

(3)在實現數據的參考完整性方面,可以加速表和表之間的關聯;

(4)在使用分組和排序自居進行數據查找時,可以顯著減少查詢中分組和排序的時間

過多的索引還會帶來以下缺點:

(1)創建索引和維護索引需要耗費時間,並且隨着數據量的增加所耗費的時間也會增加;

(2)索引需要佔用磁盤空間,除了數據表佔用磁盤空間之外,每一個索引還要佔用一定的物理空間,如果有大量的索引,索引文件可能比數據文件還大;

(3)當對表中的數據進行增加、刪除和修改的時候,索引也要動態維護,降低了數據的維護速度。

02

索引的簡單分類

索引的分類可以簡單分為以下幾種:

(1)普通索引和唯一索引

普通索引是MySQL中基本索引類型,允許在定義索引的列中插入重複值和空值;

CREATE TABLE book  (  bookid                INT NOT NULL,  bookname              VARCHAR() NOT NULL,  authors                VARCHAR() NOT NULL,  info                   VARCHAR() NULL,  comment               VARCHAR() NULL,  year_publication       YEAR NOT NULL,  INDEX(year_publication)  );  

唯一索引指的是索引列的值必須唯一,但是允許有控制,如果是組合索引,則列值的組合必須為宜;

CREATE TABLE t1  (  id    INT NOT NULL,  name CHAR() NOT NULL,  UNIQUE INDEX UniqIdx(id)  );  

主鍵索引是一種特殊的唯一索引,不允許有空值;

(2)單列索引和組合索引

單列索引指的是一個索引只包含一個列,一個表可以有多個單列索引;

CREATE TABLE t2  (  id   INT NOT NULL,  name CHAR() NULL,  INDEX SingleIdx(name())  );  

組合索引值得是在多個字段上組合創建索引,只有在查詢條件中使用了這些字段左邊的字段時,索引才會被使用。

CREATE TABLE t3  (  id    INT NOT NULL,  name CHAR()  NOT NULL,  age  INT NOT  NULL,  info VARCHAR(),  INDEX MultiIdx(id, name, age())  );  

(3)全文索引

全文索引在定義索引的列上支持值的全文查找,允許在這些索引列中插入重複值和空值,全文索引可以在char,varchar,text類型的列上創建。MyISAM存儲引擎支持全文索引;

CREATE TABLE t4  (  id    INT NOT NULL,  name CHAR() NOT NULL,  age  INT NOT NULL,  info VARCHAR(),  FULLTEXT INDEX FullTxtIdx(info)  ) ENGINE=MyISAM;  

(4)聚集索引與非聚集索引

聚集(clustered)索引,也叫聚簇索引,類似字典中的拼音查詢,它的定義:數據行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,一個表中只能擁有一個聚集索引。MySQL里主鍵就是聚集索引。它的特點是非空,唯一。

非聚集(unclustered)索引,類似字典中的偏旁部首查詢。它的定義:該索引中索引的邏輯順序與磁盤上行的物理存儲順序不同,一個表中可以擁有多個非聚集索引。

關於這兩種索引,後續會再進行分析。

(5)空間索引是對空間數據類型的字段建立的索引,這個不經常使用,這裡不做贅述。

03

索引的設計原則

索引設計不合理或者缺少索引都會對數據庫的性能造成障礙,高效的索引對於獲得良好的性能十分重要,設計索引時考慮的準則大概有以下幾種:

(1)索引不是越多越好,過多的索引維護起來不方便,而且佔用磁盤空間;

(2)避免對經常更新的表進行過多的索引,而對於經常查詢的字段,需要創建索引,但是要避免添加不必要的字段;

(3)數據量小的表最好不用索引,由於數據量小,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果;

(4)在不同值較多的列上建立索引,如果一個列是性別屬性,那麼最好不要建立索引,因為該字段只有兩個不同值;

(5)當唯一性是某種數據本身的特徵時,指定唯一索引,使用唯一索引能夠確保定義的列的數據的完整性,從而提高查詢速度。

(6)在頻繁進行排序或者分組的列上簡歷索引,如果待排序的列有多個,可以在這些列上建立組合索引。