1. 程式人生 > MYSQL進階教學 ><p>MySQL 索引詳細解讀</p>

<p>MySQL 索引詳細解讀</p>

索引是資料庫中用來提高效能的常用工具。本節主要介紹 MySQL 索引的概念,及其優點。

1.索引概念

索引在 MySQL 中也叫“鍵(Key)”,是儲存引擎用於快速查詢記錄的一種資料結構,這也是索引的基本功能。

MySQL 索引的工作原理,類似一本書的目錄,如果要在一本書中找到特定的知識點,先通過目錄找到對應的頁碼。在 MySQL 中,儲存引擎用類似的方法使用索引,先在索引找到對應值,再根據索引記錄找到對應的資料行。簡單總結,索引就是為了提高資料查詢的效率,跟一本書的目錄一樣。

以下查詢假設欄位 c2 上建有索引,則儲存引擎將通過索引找到 c2 等於 測試01 的行。也就是說,儲存引擎先在索引按值進行查詢,再返回所有包含該值的資料行。

mysql> select * from t1 where c2='測試01'\G
*************************** 1. row ***************************
c1: 1
c2: 測試01
1 row in set (0.00 sec)

從執行計劃的角度,也可以看出索引 idx_c2 被使用:

mysql> create table t1(
    ->     c1 int not null auto_increment,
    ->     c2 varchar(10) default null,
    ->     primary
key(c1) -> ) engine = innodb; Query OK, 0 rows affected (0.05 sec) mysql> insert into t1() values(1,'測試01'); Query OK, 1 row affected (0.00 sec) mysql> create index idx_c2 on t1(c2); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> explain select * from t1 where
c2='測試01'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ref possible_keys: idx_c2 key: idx_c2 key_len: 33 ref: const rows: 1 filtered: 100.00 Extra: Using index 1 row in set, 1 warning (0.00 sec)

常見的索引型別主要有 B-Tree 索引、雜湊索引、空間資料索引(R-Tree)、全文索引,在後續小節將詳細介紹。

  • InnoDB 和 MyISAM 儲存引擎可以建立 B-Tree 索引,單列或多列都可以建立索引;

  • Memory 儲存引擎可以建立雜湊索引,同時也支援 B-Tree 索引;

  • 從 MySQL5.7 開始,InnoDB 和 MyISAM 儲存引擎都可以支援空間型別索引;

  • InnoDB 和 MyISAM 儲存可以支援全文索引(FULLTEXT),該索引可以用於全文搜尋,僅限於CHAR、VARCHAR、TEXT 列。

2. 索引優點

索引最大的作用是快速查詢資料,除此之外,索引還有其他的附加作用。

B-Tree 是最常見的索引,按照順序儲存資料,它可以用來做 order bygroup by 操作。因為 B-Tree 是有序的,將相關的值都儲存在一起。因為索引儲存了實際的列值,某些查詢僅通過索引就可以完成查詢,如覆蓋查詢。

總的來說,索引三個優點如下:

  • 索引可以大大減少 MySQL 需要掃描的資料量;
  • 索引可以幫助 MySQL 避免排序和臨時表;
  • 索引可以將隨機 IO 變為順序 IO。

但是,索引是最好的解決方案嗎?任何事物都是有兩面性的,索引同樣如此。索引並不總是最好的優化工具

  • 對於非常小的表,大多數情況,全表掃描會更高效;
  • 對於中大型表,索引就非常有效;
  • 對於特大型表,建索引和用索引的代價是日益增長,這時候可能需要和其他技術結合起來,如分割槽表。

總的來說,只有當使用索引利大於弊時,索引才是最好的優化工具。

3. 小結

本節主要學習了索引的基本概念和優點。以一句話來總結:索引就是為了提高資料查詢的效率,跟一本書的目錄一樣。同時我們也要認識到,索引很好,但並不總是最好的解決方案,索引也會帶來一些負面效果。