文章目录
- 写在前面
- 使用函数索引
- 1、数据准备
- 2、索引验证
- (1)普通索引
- (2)函数索引
- 总结
写在前面
之前我们知道,如果在查询中加入了函数,索引不生效,所以MySQL 8引入了函数索引,MySQL 8.0.13开始支持在索引中使用函数(表达式)的值。
函数索引基于虚拟列功能实现,在MySQL中相当于新增了一个列,这个列会根据你的函数来进行计算结果,然后使用函数索引的时候就会用这个计算后的列作为索引。
使用函数索引
1、数据准备
-- 建表
create table test(n1 varchar(10),n2 varchar(10));
-- 创建普通索引
create index idx_n1 on test(n1);
-- 创建一个大写的函数索引
create index func_idx on test((UPPER(n2)));
-- 准备数据
insert into test values('zhangsan', 'zhangsan2');
insert into test values('lisi', 'lisi2');
insert into test values('wangwu', 'wangwu2');
insert into test values('zhaoliu', 'zhaoliu2');
-- 查看索引
show index from test;
我们看到目前有两个索引,其中一个索引是通过表达式实现的:
2、索引验证
(1)普通索引
n1字段我们加了普通的字段索引,所以使用函数会导致索引失效:
explain SELECT * FROM `test` where UPPER(n1) = 'ZHANGSAN';
直接通过字段匹配,是可以正常使用索引的:
explain SELECT * FROM `test` where n1 = 'zhangsan';
(2)函数索引
n2字段我们添加了函数索引,直接通过函数匹配可以使用索引:
explain SELECT * FROM `test` where UPPER(n2) = 'ZHANGSAN';
但是不使用函数,直接匹配字段,是不会使用索引的:
explain SELECT * FROM `test` where n2 = 'zhangsan';
总结
当必须要使用函数时,通过创建函数索引,也可以极大的提高查询效率。