Mysql8.0.x新特性及其性能优化分析

这篇具有很好参考价值的文章主要介绍了Mysql8.0.x新特性及其性能优化分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

8.0.17及之后的版本更新的内容比较多,推荐使用8.0.17及之后的版本。

参考文档:

添加弃用和删除的特性:https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

添加弃用和删除的参数: https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.ht
ml
Mysql8 InnoDB 架构: https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html
本文对mysql8.0新特性整理了17个,从实用性优先级先后介绍和分析:

1 隐藏索引

隐藏某个索引时,不被查询优化器使用,通过设置索引隐藏,观察数据库的性能变化来判断索引是否有作用,来决定是否删除某个索引,在优化调试时起了很大的作用。

用法:

ALTER TABLE t ALTER INDEX i INVISIBLE;

恢复语句是:

ALTER TABLE t ALTER INDEX i VISIBLE;

2 设置持久化

MySQL 的设置可以在运行时通过 SET GLOBAL 命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。

MySQL 8 新增了 SET PERSIST 命令,例如:

SET PERSIST max_connections = 500;

MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。

3 默认编码改为UTF-8 编码

从 MySQL 8 开始,数据库的缺省编码将改为 utf8mb4,这个编码包含了所有 emoji 字符。

在之前默认是 latin,不手动修改编码会导致中文乱码。

4 通用表表达式(Common Table Expressions)

以前复杂的子查询:

SELECT t1.*, t2.* FROM 

  (SELECT col1 FROM table1) t1,

  (SELECT col2 FROM table2) t2;

而有了 CTE之后:

WITH

  t1 AS (SELECT col1 FROM table1),

  t2 AS (SELECT col2 FROM table2)

SELECT t1.*, t2.* 

FROM t1, t2;

这样看上去层次和区域都更加分明,维护性更好;

关于 CTE 的更详细介绍请看官方文档。

5 窗口函数(Window Functions)

MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。

窗口函数有点像是 SUM()、COUNT() 那样的集合函数,但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。

select *, rank() over w as `rank` from classes window w as (order by stu_count);

mysql8.x哪个版本好,数据库,数据库,性能优化

6 新增降序索引

对于业务场景常用降序的字段,可以设置降序索引,大大提升了性能。

7 group by 不再隐式排序

mysql 8.0 对于group by 字段不再隐式排序,如需要排序,必须显式加上order by 子句。

select count(*),c2 from t1 group by c2 order by c2;文章来源地址https://www.toymoban.com/news/detail-858830.html

8 新增函数索引

之前我们知道,如果在查询中加入了函数,索引不生效,所以MySQL 8引入了函数索引,MySQL
8.0.13开始支持在索引中使用函数(表达式)的值。
函数索引基于虚拟列功能实现,在MySQL中相当于新增了一个列,这个列会根据你的函数来进行计算结果,然后使用函数索引的时候就会用这个计算后的列作为索引。

9 innodb存储引擎select for update跳过锁等待

对于select ... for share(8.0新增加查询共享锁的语法)或 select ... for update, 在语句后面添加
NOWAIT、SKIP LOCKED语法可以跳过锁等待,或者跳过锁定。
在5.7及之前的版本,select...for update,如果获取不到锁,会一直等待,直到
innodb_lock_wait_timeout超时。
在8.0版本,通过添加nowait,skip locked语法,能够立即返回。如果查询的行已经加锁,那么nowait
会立即报错返回,而skip locked也会立即返回,只是返回的结果中不包含被锁定的行。
应用场景比如查询余票记录,如果某些记录已经被锁定,用skip locked可以跳过被锁定的记录,只返
回没有锁定的记录,提高系统性能。

10 新增innodb_dedicated_server自适应参数

能够让InnoDB根据服务器上检测到的内存大小自动配置innodb_buffer_pool_size,
innodb_log_file_size等参数,会尽可能多的占用系统可占用资源提升性能。解决非专业人员安装数据
库后默认初始化数据库参数默认值偏低的问题,前提是服务器是专用来给MySQL数据库的,如果还有
其他软件或者资源或者多实例MySQL使用,不建议开启该参数,不然会影响其它程序。
mysql8.x哪个版本好,数据库,数据库,性能优化

11 死锁检查控制

MySQL 8.0 (MySQL 5.7.15)增加了一个新的动态变量 innodb_deadlock_detect,用于控制系统是否
执行 InnoDB 死锁检查,默认是打开的。死锁检测会耗费数据库性能的,对于高并发的系统,我们可
以关闭死锁检测功能,提高系统性能。但是我们要确保系统极少情况会发生死锁,同时要将锁等待超
时参数调小一点,以防出现死锁等待过久的情况。
show variables like '%innodb_dedicated_server%'; --默认是OFF关闭,修改为ON打开

12 undo文件不再使用系统表空间

默认创建2个UNDO表空间,不再使用系统表空间。

13 binlog日志过期时间精确到秒

之前是天,并且参数名称发生变化. 在8.0版本之前,binlog日志过期时间设置都是设置
expire_logs_days参数,而在8.0版本中,MySQL默认使用binlog_expire_logs_seconds参数。

14 MyISAM系统表全部换成InnoDB表

将系统表(mysql)和数据字典表全部改为InnoDB存储引擎,默认的MySQL实例将不包含MyISAM表,除非手动创建MyISAM表。

15 元数据存储变动

MySQL 8.0删除了之前版本的元数据文件,例如表结构.frm等文件,全部集中放入mysql.ibd文件里。
可以看见下图test库文件夹里已经没有了frm文件。

16 自增变量持久化

在8.0之前的版本,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启
后,会重置AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或
者其他难以发现的问题。自增主键重启重置的问题很早就被发现(https://bugs.mysql.com/bug.php?id=
199),一直到8.0才被解决,8.0版本将会对AUTO_INCREMENT值进行持久化,MySQL重启后,该值 将不会改变。

17 DDL原子化

InnoDB表的DDL支持事务完整性,要么成功要么回滚。
MySQL 8.0 开始支持原子 DDL 操作,其中与表相关的原子 DDL 只支持 InnoDB 存储引擎。一个原子DDL 操作内容包括:更新数据字典,存储引擎层的操作,在 binlog 中记录 DDL 操作。支持与表相关的 DDL:数据库、表空间、表、索引的 CREATE、ALTER、DROP 以及 TRUNCATE TABLE。支持的其它 DDL :存储程序、触发器、视图、UDF 的 CREATE、DROP 以及ALTER 语句。支持账户管理相关的 DDL:用户和角色的 CREATE、ALTER、DROP 以及适用的 RENAME等等。

到了这里,关于Mysql8.0.x新特性及其性能优化分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL8.0概述及新特性

    【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】 【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java 目前互联网上常见的数据库管理软件有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、informix这几种,如下是2022年DB-Engines Ranking对数据库受欢迎程

    2024年02月05日
    浏览(25)
  • 【MySQL】MySQL8.1.0版本正式发布带来哪些新特性?

    2023年7月18日晚,MySQL官方网站正式发布了MySQL8.1.0与8.0.34版本. Oracle 每季度发布一次 MySQL 更新,所以自己也一直留意的官网的动态,2023年7月18日晚,MySQL官方网站正式发布了MySQL8.1.0与8.0.34版本,8.1的应该来说是8.0版本的bug修复,这是 MySQL 变更发版模型后的第一个创新版本 (

    2024年02月13日
    浏览(24)
  • 第18章_MySQL8其它新特性

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: MySQL学习 ✨特色专栏: MySQL学习 🥭本文内容:第18章_MySQL8其它新特性 🖥️个人小站 :个人博客,欢迎大家访问 📚个人知识库: 知识库,欢迎

    2023年04月08日
    浏览(26)
  • MySQL8新特性:公用表表达式

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 公用表表达式(或通用表表达式)简称为CTE(Common Table Expressions)。 CTE是一个命名的临时结果集,

    2024年02月15日
    浏览(24)
  • MySQL8.1.0版本正式发布,一起尝鲜新特性

    📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA工作经验 一位上进心十足的【大数据领域博主】!😜😜😜 中国DBA联盟(ACDU)成员,目前从事DBA及程序编程 擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等

    2024年02月17日
    浏览(30)
  • MYSQL8优化

    从 设计 上优化 从 查询 上优化 从 索引 上优化 从 存储 上优化 参数 解释 Com_select 执行select操作的次数,一次查询只累加1 Com_insert 执行INSERT操作的次数,对于批量插入的INSERT操作,值累加一次 Com_update 执行UPDATE操作的次数 Com_delete 执行DELETE操作的次数 Innodb_rows_read select查询

    2023年04月21日
    浏览(24)
  • mysql8.0.30一些新增特性和xtrabackup的对应

    应客户需求在给mysql实例进行升级之后,(从8.0.2X升级到8.0.3X),发现不能备份成功,查看日志发现是xtrabackup备份时找不到事务日志ib_logfile0。 经过查看,发现data目录下面确实没有这个文件,导致备份失败。 事务日志对于mysql是必要的,它可以保证mysql故障恢复和write-ahead-

    2024年02月09日
    浏览(32)
  • MySQL8.0 优化器介绍(二)

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 作者: 奥特曼爱小怪兽 文章来源:GreatSQL社区投稿 上一篇 MySQL8.0 优化器介绍(一)介绍了成本优化模型的三要素:表关联顺序,与每张表返回的行数

    2023年04月17日
    浏览(24)
  • MySQL8.0 优化器介绍(三)

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 作者: 奥特曼爱小怪兽 文章来源:GreatSQL社区原创 往期回顾 MySQL8.0 优化器介绍(一) MySQL8.0 优化器介绍(二) 本篇将进一步深入介绍优化器相关的

    2023年04月19日
    浏览(23)
  • Linux中安装MySQL8版本,安装MySQL步骤,MySQL8离线安装

    1.检查下libaio.so.1的位置 [root@tdx ]# whereis libaio.so.1 libaio.so: /usr/lib64/libaio.so.1 如果没有找到该文件 (1).在线安装 [root@tdx ]# yum install -y libaio (2).离线安装: 上传之后执行命令安装: [root@tdx /]# rpm -ivh libaio-0.3.107-10.el6.x86_64.rpm 2.清空系统中的原有mariadb的配置文件(/etc/my.cnf) [root@tdx

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包