5.MySQL8.0新特性(二)

  1. 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角色、密码强度、授权。

  2. 隐藏索引
    隐藏索引字面意思就是把索引进行隐藏,即不可见,它不是用来查询优化的,所以它不会被优化器使用到。隐藏索引适用于除主键索引(显示或者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)隐藏索引设置:
    如果一个索引被设置成隐藏了,但实际上又需要被优化器使用,有几种表索引情况缺失对查询造成的影响:

    1. SQL 查询语句中包含了索引提示指向不可见索引会发生错误;
    2. 性能模式数据中显示了受影响 SQL 查询语句的负载增高;
    3. SQL 查询语句进行 EXPLIAN 时出现了不同的执行计划;
    4. SQL 查询语句出现在了慢查询日志中(之间没有出现);

    系统变量 optimizer_switch 的 use_invisible_insexes 标识的值,控制了优化器执行计划构建时是否使用隐藏索引。
    如果 use_invisible_insexes 值设置为 off 关闭状态(默认值),优化器默认会忽略隐藏索引,即和加入该参数之前的效果一样。
    如果 use_invisible_insexes 值设置为 no 打开状态,隐藏索引仍然保持不可见,但优化器会把隐藏索引加入到执行计划的构建中。
    如果想要在某条单个 SQL 查询语句上启用索引,可以使用 SET_VAR 优化器提示临时更新 optimizer_switch 的值。
    :索引的可见性不会影响索引的自身维护,例如,不管索引是可见还是不可见,每次表数据行的更改索引都会更新,并且唯一索引也可防止插入重复数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值