MysqL 哈希索引、空间数据索引、全文索引
紧接上一小节,本小节重点介绍哈希索引、空间数据索引、全文索引。
1.哈希索引
1.1 存储结构
以 customer 表为例,我们来看看索引是如何组织数据的存储的:
MysqL> create table customer(
id int,
last_name varchar(),
first_name varchar(),
birth_date date,
key idx1_customer(first_name) using hash
) ENGINE=MEMORY;
MysqL> select * from customer;
+------+-----------+------------+------------+
| id | last_name | first_name | birth_date |
+------+-----------+------------+------------+
| | Allen | Cuba | -- |
| | Barrymore | Julia | -- |
| | Basinger | Viven | -- |
+------+-----------+------------+------------+
rows in set ( sec)
假设哈希索引使用哈希函数(),返回的值如下:
('Cuba')=
('Julia')=
('Viven')=
哈希索引的数据结构如下:
+-----------+-----------------------+
| 槽(Slot) | 值(Value) |
+-----------+-----------------------+
| | 指向第行的指针 |
| | 指向第行的指针 |
| | 指向第行的指针 |
+-----------+-----------------------+
InnoDB 存储引擎也能支持哈希索引,但它所支持的哈希索引是自适应的。InnoDB 存储引擎会根据表的使用情况,在内存中基于 B-Tree 索引之上再创建一个哈希索引,这种行为是自动的、内部的行为,不能人为去干预是否在一张表中生成哈希索引。
1.2 适合哈希索引的查询类型
精确匹配所有列
和索引中的所有列进行精确匹配,如查找名字为Julia的客户。
MysqL> explain select * from customer where first_name='Julia'\G
*************************** . row ***************************
id:
select_type: SIMPLE
table: customer
partitions: NULL
type: ref
possible_keys: idx1_customer
key: idx1_customer
key_len:
ref: const
rows:
filtered:
Extra: NULL
row in set, warning ( sec)
1.3 哈希索引的限制
2.空间数据索引 R-Tree
常见的存储引擎中,MyISAM 存储引擎支持空间索引,主要用作地理数据存储。空间索引会从所有维度来索引数据,查询时,可以使用任意维度来组合查询。这点和 B-Tree 索引不同,空间索引不需要前缀查询。MysqL 的 GIS 支持其实并不完善,一般情况并不建议在 MysqL 中使用空间索引。
3.全文索引
全文索引查找的是文本中的关键词,并不是直接比较索引中的值,它是一种特殊类型的索引。全文索引和其他索引的匹配方式完全不一样,更类似于搜索引擎,并不是简单的 where 条件匹配。
在相同的列上可以同时创建全文索引和 B-Tree 索引,全文索引适用于 match against 操作,不是简单的where 条件操作。