MySQL 索引詳細(xì)解讀
索引是數(shù)據(jù)庫中用來提高性能的常用工具。本節(jié)主要介紹 MySQL 索引的概念,及其優(yōu)點(diǎn)。
1.索引概念
索引在 MySQL 中也叫“鍵(Key)”,是存儲引擎用于快速查找記錄的一種數(shù)據(jù)結(jié)構(gòu),這也是索引的基本功能。
MySQL 索引的工作原理,類似一本書的目錄,如果要在一本書中找到特定的知識點(diǎn),先通過目錄找到對應(yīng)的頁碼。在 MySQL 中,存儲引擎用類似的方法使用索引,先在索引找到對應(yīng)值,再根據(jù)索引記錄找到對應(yīng)的數(shù)據(jù)行。簡單總結(jié),索引就是為了提高數(shù)據(jù)查詢的效率,跟一本書的目錄一樣。
以下查詢假設(shè)字段 c2
上建有索引,則存儲引擎將通過索引找到 c2
等于 測試01
的行。也就是說,存儲引擎先在索引按值進(jìn)行查找,再返回所有包含該值的數(shù)據(jù)行。
mysql> select * from t1 where c2='測試01'\G
*************************** 1. row ***************************
c1: 1
c2: 測試01
1 row in set (0.00 sec)
從執(zhí)行計(jì)劃的角度,也可以看出索引 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 索引、哈希索引、空間數(shù)據(jù)索引(R-Tree)、全文索引,在后續(xù)小節(jié)將詳細(xì)介紹。
-
InnoDB 和 MyISAM 存儲引擎可以創(chuàng)建 B-Tree 索引,單列或多列都可以創(chuàng)建索引;
-
Memory 存儲引擎可以創(chuàng)建哈希索引,同時(shí)也支持 B-Tree 索引;
-
從 MySQL5.7 開始,InnoDB 和 MyISAM 存儲引擎都可以支持空間類型索引;
-
InnoDB 和 MyISAM 存儲可以支持全文索引(FULLTEXT),該索引可以用于全文搜索,僅限于CHAR、VARCHAR、TEXT 列。
2. 索引優(yōu)點(diǎn)
索引最大的作用是快速查找數(shù)據(jù),除此之外,索引還有其他的附加作用。
B-Tree 是最常見的索引,按照順序存儲數(shù)據(jù),它可以用來做 order by
和 group by
操作。因?yàn)?B-Tree 是有序的,將相關(guān)的值都存儲在一起。因?yàn)樗饕鎯α藢?shí)際的列值,某些查詢僅通過索引就可以完成查詢,如覆蓋查詢。
總的來說,索引三個(gè)優(yōu)點(diǎn)如下:
- 索引可以大大減少 MySQL 需要掃描的數(shù)據(jù)量;
- 索引可以幫助 MySQL 避免排序和臨時(shí)表;
- 索引可以將隨機(jī) IO 變?yōu)轫樞?IO。
但是,索引是最好的解決方案嗎?任何事物都是有兩面性的,索引同樣如此。索引并不總是最好的優(yōu)化工具
- 對于非常小的表,大多數(shù)情況,全表掃描會更高效;
- 對于中大型表,索引就非常有效;
- 對于特大型表,建索引和用索引的代價(jià)是日益增長,這時(shí)候可能需要和其他技術(shù)結(jié)合起來,如分區(qū)表。
總的來說,只有當(dāng)使用索引利大于弊時(shí),索引才是最好的優(yōu)化工具。
3. 小結(jié)
本節(jié)主要學(xué)習(xí)了索引的基本概念和優(yōu)點(diǎn)。以一句話來總結(jié):索引就是為了提高數(shù)據(jù)查詢的效率,跟一本書的目錄一樣。同時(shí)我們也要認(rèn)識到,索引很好,但并不總是最好的解決方案,索引也會帶來一些負(fù)面效果。