<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 by
和 group by
操作。因為 B-Tree 是有序的,將相關的值都儲存在一起。因為索引儲存了實際的列值,某些查詢僅通過索引就可以完成查詢,如覆蓋查詢。
總的來說,索引三個優點如下:
- 索引可以大大減少 MySQL 需要掃描的資料量;
- 索引可以幫助 MySQL 避免排序和臨時表;
- 索引可以將隨機 IO 變為順序 IO。
但是,索引是最好的解決方案嗎?任何事物都是有兩面性的,索引同樣如此。索引並不總是最好的優化工具
- 對於非常小的表,大多數情況,全表掃描會更高效;
- 對於中大型表,索引就非常有效;
- 對於特大型表,建索引和用索引的代價是日益增長,這時候可能需要和其他技術結合起來,如分割槽表。
總的來說,只有當使用索引利大於弊時,索引才是最好的優化工具。
3. 小結
本節主要學習了索引的基本概念和優點。以一句話來總結:索引就是為了提高資料查詢的效率,跟一本書的目錄一樣。同時我們也要認識到,索引很好,但並不總是最好的解決方案,索引也會帶來一些負面效果。