mysql索引类型(按存储结构划分)
关于mysql索引类型,网上有很多相关的介绍,给人的感觉很乱。鄙人在翻阅相关书籍后,特意梳理了一下。哪里有不对的地方,欢迎指正!
1. B-Tree索引
它使用B-Tree数据结构来存储数据,实际上很多存储引擎使用的是B+Tree。B+Tree和B-Tree的不同点在于:
(1) 非叶子节点只存储键值信息
(2) 所有叶子节点之间都有链指针
(3) 数据记录都存放在叶子节点中
B-Tree模型:
B+Tree模型:
B-Tree对索引列是顺序组织存储的,很适合查找范围数据。看下B-Tree索引适用哪些查询:
(1) 全值匹配
全值匹配是指查询中使用的条件和索引中的所有列进行匹配。比如有索引 index(last_name, first_name, date) ,查询的条件为:where last_name=? and first_name=? and date=? 。
(2) 匹配最左前缀
只使用索引的第一列。比如查询条件为:where last_name = ?
(3) 匹配列前缀
只匹配某一列值得开头部分。
(4) 匹配范围值
(5) 精确匹配某一列并范围匹配另一列
比如:where last_name = ? and first_name like kim%
(6) 只访问索引的查询
2. 哈希索引
哈希索引基于哈希表实现。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。在mysql中,Memory引擎显式支持哈希索引。
举例说明,有张表:
CREATE TABLE testhash (
fname VARCHAR(50) NOT NULL,
lname VARCHAR(50) NOT NULL,
KEY USING HASH(fname)
) ENGINE=MEMORY;
表中有如下数据:
fname | lname |
Arjen | Lentz |
Baron | Schwartz |
Peter | Zaitsev |
Vadim | Tkachenko |
假设索引使用假想的哈希函数f(), 如下:
f('Arjen') = 2323
f('Baron') = 7437
f('Peter') = 8784
f('Vadim') = 2458
那么哈希索引的数据结构:
槽(Slot) 值(Value)
2323 指向第1行的指针
2458 指向第4行的指针
7437 指向第2行的指针
8784 指向第3行的指针
如果使用一条sql语句进行查询:select lname from testhash where fname = 'Peter'; 过程为:
计算‘Peter’的哈希值(f('Peter')=8784)----->查找哈希值对应的指针----->根据指针或得相应的数据。
哈希索引的特点:索引的结构十分紧凑,因此查找速度非常快;哈希索引数据不是按照索引顺序存储的,无法用于排序;哈希索引不支持部分索引列匹配查找;哈希索引只支持等值比较查询(=,IN(),<=>),不支持范围查询,如where price>100;
3. 全文索引
全文索引查找的是文本中的关键词,不是直接比较索引中的值。
- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------