MySQL 函数索引

Posted 辣肉面加蛋加素鸡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 函数索引相关的知识,希望对你有一定的参考价值。

  • 一. 函数索引简介

  • 二. 函数索引测试

    • 1. 创建表结构

    • 2. 插入数据

    • 3. 创建普通索引 idx_create_time:

    • 4. 查看 sql 执行计划:

    • 5. 创建函数索引 fun_create_time:

    • 6. 再次查看 sql 执行计划:

    • 7. 该表此时的索引信息:


  • 三. 函数索引场景

    • 1. 字段计算

    • 2. 字段子串

  • 四. 函数索引效率


一. 函数索引简介

函数索引就是给字段加了函数的索引,这里的函数也可以是表达式。所以也叫表达式索引。

这个功能是在 mysql8.0 版本引入的,本质是通过虚拟列来实现的(虚拟列 MySQL 5.7 版本引入)。

二. 函数索引测试

1. 创建表结构

create table idx_test (id int primary key auto_increment,col1 int,col2 int,col3 varchar(30),create_time TIMESTAMP default now());

2. 插入数据

insert into idx_test values (1,10,10,'helloworld','2021-01-01 00:00:00'),
(2,20,20,'hellochina','2021-02-02 00:00:00'),
(3,30,30,'hellojap','2021-03-03 00:00:00'),
(4,40,40,'hellorus','2021-04-04 00:00:00'),
(5,50,50,'helloita','2021-05-05 00:00:00');

3. 创建普通索引 idx_create_time:

alter table idx_test add index idx_create_time(create_time);

4. 查看 sql 执行计划:

5. 创建函数索引 fun_create_time:

alter table idx_test add index fun_create_time((date(create_time)));

6. 再次查看 sql 执行计划:

MySQL 函数索引

7. 该表此时的索引信息:

MySQL 函数索引

通过简单的测试测试了下函数索引,接下来再看看函数索引的其他使用场景。

三. 函数索引场景

1. 字段计算

查询 sql:

MySQL 函数索引

新增 col1 + col2 的函数索引:

alter table idx_test add index fun_colsum( (col1 + col2) );

查看执行计划:

MySQL 函数索引

2. 字段子串

查询 sql:

MySQL 函数索引

新增 col3 子串的函数索引:

alter table idx_test add index fun_subcol( (substr(col3, 6, 8)) );

查看执行计划:

MySQL 函数索引

其他场景还有 right 函数、cast 函数求 json 的value 等,都可以按照此类套路去建立函数索引。

四. 函数索引效率

函数索引的使用条件比较苛刻,sql 必须严格按照索引建立的定义来写,这样才能用到函数索引。

如果两条 sql 一个用到普通索引,一个用到函数索引,结果集一致,那哪个 sql 的开销会大点?

sql1 用到普通索引:

select * from idx_test where create_time > '2021-02-02 00:00:00' and create_time <='2021-03-03 00:00:00';

sql2 用到函数索引:

select * from idx_test where date(create_time)='2021-03-03';

通过 explain format=json 来看下详细执行计划:

sql1 用到普通索引:

sql2 用到函数索引:

普通索引的开销会大点,也比较符合预期,本来建立函数索引就是为了查询更为高效。总的来看,函数索引在特定场景还是很有用处的,只要严格遵守函数索引的定义去编写 sql,那就能大大减少不必要的开销。

这里也期待 tidb 在5.2版本时,expression index 新功能的表现。


以上是关于MySQL 函数索引的主要内容,如果未能解决你的问题,请参考以下文章

乐哥学AI_Python:Numpy索引,切片,常用函数

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

java.lang.IllegalStateException:键 f0 的片段不再存在:索引 1

mysql 强大的trim() 函数

javascript UV Index Monitor App订阅PubNub并显示UV索引值。博文的代码片段。在这里查看项目:https:// githu

c_cpp UV Index Indicator订阅PubNub并使用颜色显示UV索引值。博文的代码片段。在这里查看项目:https:/