sql自学笔记(十六)——MySQL8.0版本的新特性(六)

函数索引

  • MySQL8.0.13开始支持索引中使用函数(表达式)的值
  • 支持降序索引,支持JSON数据的索引
  • 函数索引基于虚拟列功能实现

创建一个测试表,两个字段

create table t3(c1 varchar(10),varchar(10));

作为比较创建一个普通的索引

create index idx on t3(C1);

再创一个函数索引

create index func_idx on t3(CUPPER(c2));

创建完成后显示索引信息

show index from t3\G;
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第1张图片

sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第2张图片

执行计划器对这两个索引的使用情况

1.首先查看一下第一个索引,使用UPPER函数进行不区分大小写查询

explan select * from to where uper(cll = "ABC");
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第3张图片

如图所示,该图中用的是where查询,效率低
如果基于c2字段查询,使用函数索引方式

expain select * from t2 where supper(c2) = "ABC";
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第4张图片

如何针对某一个JSON节点对其进行索引

create table emp(data json,index((AST(data ->>'$.name' as char(30))))) ;

创建完成之后可以查看一下

show index from emp; 
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第5张图片

换一种形式更清楚一点

show index from emp\G
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第6张图片

通过索引快速查询JSON数据

explain select * from emp where (AST(data ->> '$.name' as char(30))=''abc');
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第7张图片

再回到T3表查看一下

select * from t3;
desc t3;
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第8张图片

新建一个列模拟一下c2的函数索引

alter table t3 add column c3 varchar(10)genereated always as (supper(c1));

插入一条数据

insert intoty(c1,c2) values('abc',‘abc’);

查询一下

select * from t3;
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第9张图片

模拟函数索引的效果

create index idx3 on t3(c3);

再来查询一下

explain select * from t3 where upper (c1) = 'ABC';
sql自学笔记(十六)——MySQL8.0版本的新特性(六)_第10张图片

你可能感兴趣的:(sql自学笔记(十六)——MySQL8.0版本的新特性(六))