首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MYSQL 8 Functional Indexes 功能添加与提升

MYSQL 8 Functional Indexes 功能添加与提升

作者头像
AustinDatabases
发布于 2022-02-09 09:38:59
发布于 2022-02-09 09:38:59
6900
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
MYSQL 8 的功能是的挖掘一下,PS ,SYS 系列年后会持续更新,本期的说说 MYSQL 8 的 functional Indexes,对于这个功能本身DBA 应该不陌生,但对于MYSQL 的DBA 本身来说,这个就陌生了,尤其是还在 5.X 上打转的 MYSQL DBA。

举例:下面的操作中的对于一个特定的查询看看是否陌生

1 表t_user 是我们此次的测试表

2 这里的查询语句是

代码语言:javascript
复制
select select avg(age) from t_user where month(create_time) = 10;

想想这样的查询语句开发都会写出来,逻辑是统计10月份来的员工的平均年龄。如果是MYSQL 的开发或DBA 可能会建议写成这样

代码语言:javascript
复制
select select avg(age) from t_user where create_time between "2021-10-01" and "2021-10-31";

通过时间的维度来进行计算,并且通过create_time 索引来加速查询的速度,但这样的处理的建议,实际上并不是一个好的方法原因

1 增加了开发撰写语句的负担,提高实现逻辑的复杂性。

2 日期的范围很难把握,时间短可以,但如果时间长,则计算的速度可能也不会有较大的提升。

所以如果有能支持,这样写法的索引,函数索引,那么解决问题的方法就简单了

代码语言:javascript
复制
select select avg(age) from t_user where month(create_time) = 10;

这就是MYSQL 8.013 后支持的函数索引,让以上的语法也能支持索引的功能。

我们就先建立一个相关的索引,但情况并为改变,还是无法走索引

代码语言:javascript
复制
alter table t_user add index ((MONTH(create_time)));
 explain  select avg(age) from t_user where month(create_time) = 12;

上面的这个例子可能比较简单,实际上函数索引本身可以很复杂,如

两个字段的和来建立索引, 并且在计算中对函数索引中计算后的值,进行排序。

函数索引本身也是有一些限制的,在MYSQL 中

1 不能建立两个毫无关系的字段的或以上的索引如 index ((col1),(col2))

2 主键不能建立函数索引

3 外键不能建立函数索引

4 全文索引以及spaital 索引不能建立索引

5 函数索引不能成为部分索引的一部分

并且通过MYSQL 5.7 支持虚拟列的方式将函数索引联合使用,直接在MYSQL 得表中产生一个虚拟的列作为函数索引的目的地。

代码语言:javascript
复制
alter table t_user add column create_month tinyint generated always as (MONTH(create_time)) VIRTUAL;

直接在查询中使用这个虚拟的列。

MYSQL 8 从这几年在开发中的功能提升并未停止,而大部分企业还留在MYSQL 5.7 并为发现MYSQL 8 的开发中的新的功能以及MYSQL 8 功能更新下宣传不够,才是目前 MYSQL 数据库需要解决的问题,让更多的企业升级到MYSQL 8 并使用更新的高可用方式,才是MYSQL 后续发展的可持续的道路。

参考官方文档地址

https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档