MySQL 8.0新特性专栏目录
《MySQL开发规范》过时了,视图查询性能提升了一万倍
你真的会用EXPLAIN么,SQL性能优化王者晋级之路
索引三剑客之降序索引和不可见索引
千呼万唤始出来,MySQL 8.0索引三剑客之函数索引
双重密码,MySQL 8.0创新特性
sql_mode兼容性,MySQL 8.0 升级踩过的坑
警惕参数变化,MySQL 8.0 升级避免再次踩坑
千呼万唤始出来,MySQL 8.0索引三剑客之函数索引
前言
独孤九剑,重剑无锋,大巧不工,通晓剑意,无所施而不可。三剑客之首,函数索引。
函数索引这个概念并不新颖,Oracle早在十年前的Oracle10g中就支持了函数索引,函数索引在Oracle数据库中使用相当广泛和成熟,而MySQL却一直没有开发相关的索引功能。不过好消息是,MySQL 终于在8.0版本引入了这一特性。真的是,千呼万唤始出来,不过好歹还是来了。
普通索引是对列值或列的前缀值进行索引,而MySQL 8.0.13之后支持函数索引,函数索引是对表中的列执行表达式计算后的结构进行索引,而不是对列或列前缀值。使用函数索引可以对未直接存储在表中的数据进行索引。
函数索引为应用程序提供了极大的便利和性能提升。
1. 创建和使用函数索引
1.1 创建函数索引
创建函数索引的语法跟普通索引差别并不大,唯一需要注意的是函数索引对应的表达式需要用()括起来。
首先, 函数索引可以对单列的表达式进行索引,如下:
# 创建单列表达式索引
alter table t_wang add index idx_func(date(col1));
其次,函数索引也可以对多列组合的表达式进行索引,如下:
# 创建多列组合表达式索引
alter table t_wang add index idx_func((col1 + col2));
然后,函数索引也可以将表达式和普通列组合一起构成组合索引,如下:
# 创建组合索引
alter table t_wang add index idx_func(col1, (date(col1)));
最后,函数索引还可以跟其他选项,如unique 和 asc、desc排序一起使用,如下:
# 创建表达式排序索引
alter table t_wang add unique index idx_func(col1, (date(col1)) desc);
1.2 使用函数索引提升性能
函数索引可以对字段表达式进行索引,从而在SQL语句中包含表达式的情况下可以显著提升查询性能。
测试案例:
a) 创建测试表t_wang,导入一些测试数据,在时间列创建一个普通索引
# 查看表结构,测试表的时间列有个普通索引
MySQL [test]> show create table t_wang\G
*************************** 1. row ***************************
Table: t_wang
CREATE TABLE `t_wang` (
`id