MYSQL 8.0-新特性汇总(二)

优化器的增强

开始支持隐式索引

使用隐式索引的好处是:

对于数据量比较大的表去新建和删除索引,很多时候要耗费很多资源。有的时候,我们要测试增加某个索引是否对SQL的查询有优化作用,这个时候就可以通过设置索引是否可见进行判断,这样操作更快一些,也可以避免频繁创建删除所以的资源消耗

  • 查看数据库的隐式索引的SQL
mysql> SELECT INDEX_NAME, IS_VISIBLE
       FROM INFORMATION_SCHEMA.STATISTICS
       WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 't1';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| i_idx      | YES        |
| j_idx      | NO         |
| k_idx      | NO         |
+------------+------------+
  • 如何设置隐式索引开启?

SELECT @@optimizer_switch\G
通过指令行set @@optimizer_switch="use_invisible_indexes=on"可以开启隐式索引

Command-Line Format	--optimizer-switch=use_invisible_indexes={on|off}	

显示和隐式索引的几个特点:
1.不论显示还是隐式索引都会对数据扩展进行限制。例如,唯一索引,不论是否设置显性还是隐性都会对唯一性进行校验
2.没有显式主键的表如果在NOT NULL列上有UNIQUE索引,这个索引就等同于主键索引,这个索引不能被设置为隐式索引

CREATE TABLE t2 (
  i INT NOT NULL,
  j INT NOT NULL,
  UNIQUE j_idx (j)
) ENGINE = InnoDB;
mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;
ERROR 3522 (HY000): A primary key index cannot be invisible.

支持降序索引

MySQL支持降序索引: MYSQL8.0后降序索引的键值按降序存储。在8.0以前,索引可以按相反的顺序扫描,但会降低性能。降序索引使优化器可以根据查询中列的升序和降序根据索引的升降序优化查询

具体内容在另一篇博客进行汇总:https://www.cnblogs.com/perfectLi/p/16022283.html

支持列表达式索引

列前缀索引

语法规则是col_name(length)

  • 对于可以设定字符长度的字符类型VARCHAR,CHAR使用前缀索引的时候,可以指定长度或不指定。但是对于没有长度限制的TEXT,BLOB类型,必须要指定列的字符长度
  • 这个length设置的是字节长度,而不是字符长度

函数索引

用括号圈起来用以表示是表达式
函数索引不能用于列前缀,并且函数索引不能用在外键上面

  • JSON数据的某一列增加索引

要用CAST()函数设置数据类型
但是要注意CAST()函数返回的数据类型是:utf8mb4_0900_ai_ci,如果要进行判断的时候,要对判断列使用CAST()函数。或者定义所以的字符类型

CREATE TABLE employees (
  data JSON,
  INDEX ((CAST(data->>'$.name' AS CHAR(30))))
);

CREATE TABLE employees (
  data JSON,
  INDEX idx ((CAST(data->>"$.name" AS CHAR(30)) COLLATE utf8mb4_bin))
);

支持正则表达式

之前版本有的正则表达式函数REGEXP,RLIKE,MYSQL8.0 新增的函数REGEXP_LIKE和这两个函数作用相同
新增的 REGEXP_INSTR(), REGEXP_REPLACE(),REGEXP_SUBSTR()函数可以定位到匹配的位置,并且进行字符的截取,替换,新增
regexp_stack_limit ,regexp_time_limit 系统变量,控制资源使用

支持CTE

通过WITH语句生成循环或非循环的汇总临时表数据
一般用于多个查询关联临时结果,或者循环,层级查询

具体信息记录在另一篇博客中:https://www.cnblogs.com/perfectLi/p/16020986.html

窗口函数的支持

对查询的每一行数据,都可以对应的与当前行数据关联的数据的范围处理及聚合处理
现有的一些聚合函数也能在窗口函数中使用
值得注意的是窗口函数的使用会影响查询的速度

具体信息记录在另一篇博客中: https://www.cnblogs.com/perfectLi/p/16016649.html

官方文档地址: https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

posted @ 2020-03-17 23:13  PerfectLi  阅读(145)  评论(0编辑  收藏  举报