<p>MySQL 雜湊索引、空間資料索引、全文索引</p>
緊接上一小節,本小節重點介紹雜湊索引、空間資料索引、全文索引。
1.雜湊索引
雜湊索引基於雜湊表實現,僅支援精確匹配索引所有列的查詢。對於每行資料,儲存引擎都會對所有的索引列計算出一個雜湊碼。雜湊索引將所有的雜湊碼儲存在索引中,同時儲存指向每個資料行的指標。
1.1 儲存結構
常見的儲存引擎中,MEMORY 儲存引擎顯式支援雜湊索引。如果多個列的雜湊值相同,雜湊索引會以連結串列的方式存放多個記錄指標到同一個雜湊條目中。
以 customer 表為例,我們來看看索引是如何組織資料的儲存的:
mysql> create table customer(
id int,
last_name varchar (30),
first_name varchar(30),
birth_date date,
key idx1_customer(first_name) using hash
) ENGINE=MEMORY;
mysql> select * from customer;
+------+-----------+------------+------------+
| id | last_name | first_name | birth_date |
+------+-----------+------------+------------+
| 1 | Allen | Cuba | 1960-01-01 |
| 2 | Barrymore | Julia | 2000-05-06 |
| 3 | Basinger | Viven | 1979-01-24 |
+------+-----------+------------+------------+
3 rows in set (0.00 sec)
假設雜湊索引使用雜湊函式f(),返回的值如下:
f('Cuba')=1212
f('Julia')=5656
f('Viven')=2323
雜湊索引的資料結構如下:
+-----------+-----------------------+
| 槽(Slot) | 值(Value) |
+-----------+-----------------------+
| 1212 | 指向第1行的指標 |
| 2323 | 指向第3行的指標 |
| 5656 | 指向第2行的指標 |
+-----------+-----------------------+
InnoDB 儲存引擎也能支援雜湊索引,但它所支援的雜湊索引是自適應的。InnoDB 儲存引擎會根據表的使用情況,在記憶體中基於 B-Tree 索引之上再建立一個雜湊索引,這種行為是自動的、內部的行為,不能人為去幹預是否在一張表中生成雜湊索引。
1.2 適合雜湊索引的查詢型別
精確匹配所有列
和索引中的所有列進行精確匹配,如查詢名字為Julia的客戶。
資料庫先會計算first_name='Julia’的雜湊值5656,然後在索引中查詢5656,找到對應的指標為:指向第2行的指標,最後根據指標從原表拿到具體值,並進行比較是否為Julia
mysql> explain select * from customer where first_name='Julia'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: customer
partitions: NULL
type: ref
possible_keys: idx1_customer
key: idx1_customer
key_len: 93
ref: const
rows: 2
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
1.3 雜湊索引的限制
- 雜湊索引只支援等值查詢,包括=、IN、<=>;
- 雜湊索引不儲存欄位值,只包含雜湊值和行指標,不能使用索引中的值來避免讀取行;
- 雜湊索引不是按照索引值順序儲存的,不能用於排序;
- 雜湊索引不支援部分索引列匹配查詢,如在欄位(last_name,first_name)建立雜湊索引,此時需要查詢last_name='Allen’的資料行,這種查詢無法使用該雜湊索引;
- 雜湊索引不支援範圍查詢,如查詢所有姓氏在Allen和Bush之間的客戶,這種查詢無法使用雜湊索引;
- 如果出現很多雜湊衝突(不同的索引列值有相同的雜湊值),索引的維護成本是很高的,應儘量避免在選擇性很低的欄位上建立雜湊索引。
2.空間資料索引 R-Tree
常見的儲存引擎中,MyISAM 儲存引擎支援空間索引,主要用作地理資料儲存。空間索引會從所有維度來索引資料,查詢時,可以使用任意維度來組合查詢。這點和 B-Tree 索引不同,空間索引不需要字首查詢。MySQL 的 GIS 支援其實並不完善,一般情況並不建議在 MySQL 中使用空間索引。
3.全文索引
全文索引查詢的是文字中的關鍵詞,並不是直接比較索引中的值,它是一種特殊型別的索引。全文索引和其他索引的匹配方式完全不一樣,更類似於搜尋引擎,並不是簡單的 where 條件匹配。
在相同的列上可以同時建立全文索引和 B-Tree 索引,全文索引適用於 match against 操作,不是簡單的where 條件操作。
4.小結
本小節介紹了雜湊索引、空間資料索引、全文索引這三種索引型別。重點介紹了雜湊索引的儲存結構、適合雜湊索引的查詢型別和相關限制。雜湊索引僅支援精確匹配所有列的查詢,在這種查詢中,雜湊索引是非常高效的,因為雜湊索引儲存的是雜湊值,儲存結構非常緊湊。