-
MySQL8.0 新特性
1)性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面带来了更好的性能:读写工作负载、IO 密集型工作负载、以及高竞争("hot spot"热点竞争问题)工作负载。
2)NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部功能也得到了更大的改进。该项功能消除了对独立的NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整 ACID 合规性。
3)窗口函数:从 MySQL 8.0 开始,新增了一个窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数与sum()、count()这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 group by。
4)隐藏索引:在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可,如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。
5)降序索引:MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。
6)通用表表达式:在复杂的查询中使用嵌入式表时,使用 CTE 使得查询语句更清晰。
7)UTF-8 编码:从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集。
8)JSON:MySQL 8 大幅改进了对 JSON 的支持,添加了基于路劲查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT()函数,以及用于将数据分别组合到 JSON 数组合对象中的JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。
9)可靠性:InnoDB 现在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以实现事务完整性,要么失败回滚,要么成功提交,不至于出现 DDL 时部分成功的问题,此外还支持 crash-safe 特性,元数据存储在单个事务数据字典中。
10)高可用性:对 OpenSSL 的改进、新的默认身份验证、SQL角色、密码强度、授权。 -
隐藏索引
隐藏索引字面意思就是把索引进行隐藏,即不可见,它不是用来查询优化的,所以它不会被优化器使用到。隐藏索引适用于除主键索引(显示或者j隐式设置)之外的索引,意味着主键索引是不通过任何方式隐藏的。
MySQL 数据库默认创建的索引都是可见的,要显示控制一个索引的可见性,可以在create table、create index或alter table 的索引定义命令中使用 VISIBLE 或 INVISIBLE 关键字。
要变更现有索引的可见性,可以在 ALTER TABLE … ALTER INDEX 命令中使用 VISIBLE 或 INVISIBLE 关键字。
1)如年龄索引变更为可见:ALTER TABLE javastack ALTER INDEX age_idx VISIBLE ;
怎么知道一个表中的索引是可见还是不可见,可以从 INFORMATION_SCHEMA.STATISTICS 表,或者 SHOW INDEX 命令输出中获得。例如:
SELECT INDEX_NAME,IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'javastack';
2)隐藏索引作用:
从上面隐藏索引介绍我们知道,隐藏索引可以不被优化器所使用,那么我们可以把某个表的某个索引设置隐藏,然后再测试 SQL 语句的查询性能。
即可以利用隐藏索引快速测试删除索引后对 SQL 查询性能的影响,而无需进行索引删除、重建操作,如果需要该索引,再设置可见就好了,这在大表测试中无疑非常有用,因为对于大表索引的删除和重新添加很耗性能,甚至影响表的正常工作。
3)隐藏索引设置:
如果一个索引被设置成隐藏了,但实际上又需要被优化器使用,有几种表索引情况缺失对查询造成的影响:- SQL 查询语句中包含了索引提示指向不可见索引会发生错误;
- 性能模式数据中显示了受影响 SQL 查询语句的负载增高;
- SQL 查询语句进行 EXPLIAN 时出现了不同的执行计划;
- SQL 查询语句出现在了慢查询日志中(之间没有出现);
系统变量 optimizer_switch 的 use_invisible_insexes 标识的值,控制了优化器执行计划构建时是否使用隐藏索引。
如果 use_invisible_insexes 值设置为 off 关闭状态(默认值),优化器默认会忽略隐藏索引,即和加入该参数之前的效果一样。
如果 use_invisible_insexes 值设置为 no 打开状态,隐藏索引仍然保持不可见,但优化器会把隐藏索引加入到执行计划的构建中。
如果想要在某条单个 SQL 查询语句上启用索引,可以使用 SET_VAR 优化器提示临时更新 optimizer_switch 的值。
注:索引的可见性不会影响索引的自身维护,例如,不管索引是可见还是不可见,每次表数据行的更改索引都会更新,并且唯一索引也可防止插入重复数据。
5.MySQL8.0新特性(二)
最新推荐文章于 2024-05-15 13:14:13 发布