文章目录

  • 写在前面
  • 使用函数索引
  • 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;

我们看到目前有两个索引,其中一个索引是通过表达式实现的:

MySQL8.0新特性:函数索引,使用函数也不会导致索引失效~_mysql

2、索引验证

(1)普通索引

n1字段我们加了普通的字段索引,所以使用函数会导致索引失效:

explain SELECT * FROM `test` where UPPER(n1) = 'ZHANGSAN';

MySQL8.0新特性:函数索引,使用函数也不会导致索引失效~_字段_02


直接通过字段匹配,是可以正常使用索引的:

explain SELECT * FROM `test` where n1 = 'zhangsan';

MySQL8.0新特性:函数索引,使用函数也不会导致索引失效~_MySQL_03

(2)函数索引

n2字段我们添加了函数索引,直接通过函数匹配可以使用索引:

explain SELECT * FROM `test` where UPPER(n2) = 'ZHANGSAN';

MySQL8.0新特性:函数索引,使用函数也不会导致索引失效~_数据_04

但是不使用函数,直接匹配字段,是不会使用索引的:

explain SELECT * FROM `test` where n2 = 'zhangsan';

MySQL8.0新特性:函数索引,使用函数也不会导致索引失效~_mysql_05

总结

当必须要使用函数时,通过创建函数索引,也可以极大的提高查询效率。