详细介绍MySQL的索引类型
示例一:
use martin;CREATE TABLE `index_test` (
`id` int NOT NULL AUTO_INCREMENT,
`a` int NOT NULL,
`b` char(2) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into index_test(a,b) values (1,'a'),(2,'b'),(3,'c'),(5,'e'),(6,'f'),(7,'g'),(9,'i');
一、聚集索引
图为根据示例一创建表的B+树,第二行阴影部分就是主键,每个叶子节点包含全部数据
聚集索引的特点
- 聚集索引就是按照每张表的主键构造的一颗B+树
- InnoDB的主键一定是聚集索引
- 每张表只能有一个聚集索引
二、辅助索引
继续拿示例一索引来举例,a字段包含1,2,3,5,6,7,9,可以看出都是按a字段构建的B+树键值,底下的id是主键
辅助索引是先在辅助索引树找到id=3,再去聚集索引树中找到对应的数据
select * from index_test where a =3; -- 先辅助索引再聚集索引
select * from index_test where id =3; -- 直接走聚集索引
在现有的表上添加辅助索引
alter table users_info add index idx_email(email);create index idx_email_01 on users_info (email);
辅助索引的特点
- 辅助索引的叶子节点并不会放整行数据
- 辅助索引树查到主键再通过聚集索引树找到行数据
- 一颗高度为3的辅助索引树查询记录需要至少6次逻辑IO
三、唯一索引
唯一索引的特点
- 唯一性
- 唯一索引的更新不能使用Change Buffer
比如我们给users_info添加唯一索引
alter table users_info add unique key uniq_email (email);
四、联合索引
索引按创建时指定的列顺序排序。例如先按照a字段排序,再按照b字段排序。
所以b字段是无序的,B + 树支持 “最左前缀匹配”,即查询条件必须从索引的第一列开始,且中间不能跳过列。例如:
WHERE col1 = 1 AND col2 = 2
可以使用索引WHERE col2 = 2
无法使用索引(未从col1
开始)
alter table users_info add index idx_username_email(username,email);
五、前缀索引
有比较长的字符串列,直接在这个字段创建索引,会导致索引占用过多的空间,这个时候就可以考虑使用前缀索引
- 使用前缀索引的场景:char或者varchar太长
- 前缀索引的缺点:无法利用前缀索引完成排序
alter table users_info add index idx_email_2(email(2));
六、全文索引
- 全文索引的作用:字段中找到几个关键字
- 全文索引的创建
ALTER TABLE englishphrases ADD FULLTEXT (phrase);
- 进行全文搜索
SELECT * FROM englishphrases WHERE MATCH(phrase) AGAINST ('you');