MySQL5.7和MySQL8对比分析

在这里插入图片描述

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: MySQL学习
✨特色专栏: MySQL专栏
🥭本文内容:MySQL5.7和MySQL8对比分析
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: 知识库,欢迎大家访问

✨✨ 粉丝福利订阅✨✨

在这里插入图片描述

1.前言

大家好,我是Leo哥🫣🫣🫣,昨天有人问道:Leo哥,MySQL8安装咱也会了,绿色版,嘎嘎一顿操作,简单粗暴。能讲讲关于MySQL5.7和MySQL8之间的区别吗。于是就有了今天这篇文章。好了,话不多说让我们开始吧😎😎😎。

2.概览

Oracle发布新版本的MySQL时,直接从5.7.x 跳到了 8.0,可谓是一个大的版本跳跃,当然也可以从侧面反映,这里面的功能会有不少的变化,新版本的MySQL增加了不少的亮点。

总体来说,各个业务表存储引擎为InnoDB的mysql 5.7在使用语法上和mysql 8.0差别不大,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能。

3.MySQl8新增功能

下面我们先通过两种图来看一下关于MySQL8中性能升级(图一)Nosql文档升级(图二)

  1. 性能: MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争(”hot spot”热点竞争问题)工作负载。
  2. NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。
  3. 窗口函数(Window Functions):从 MySQL 8.0 开始,新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。
  4. 隐藏索引:在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。
  5. 降序索引:MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。
  6. 通用表表达式(Common Table Expressions CTE):在复杂的查询中使用嵌入式表时,使用 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. 高可用性(High Availability):InnoDB 集群为您的数据库提供集成的原生 HA 解决方案。

4.细节处理

4.1细节1:

比如我们在MySQL 5.7版本中全面推行GTID,所以之前的create table xxx as select * from xx的使用模式就不奏效了,进而我们建议使用:

create table xxx like xxxxx; 
 
insert into xxx select * from xxxxx; 

这种使用模式,而MySQL8.0带来的很多特性是在体验和性能改造方面,原来不建议使用的模式竟然可以支持了,而很多业务侧是后知后觉,原本已经培养的习惯,让我们有些凌乱。

4.2细节2:

在MySQL 5.7中字段名为rank是可以的,但是在8.0中因为有了窗口函数,字段名为rank就报错,顺着这个思路,其实我们一窥窗口函数。

4.3细节3:

这里顺便吐槽下airflow的表结构配置

airflow的一个表结构在MySQL 5.7中如下:

CREATE TABLE kube_resource_version 
(one_row_id BOOL NOT NULL DEFAULT true, resource_version VARCHAR(255), 
PRIMARY KEY (one_row_id), 
CONSTRAINT kube_resource_version_one_row_id CHECK (one_row_id), 
CHECK (one_row_id IN (0, 1))); 
Query OK, 0 rows affected (0.06 sec) 
在MySQL中其实会被默认转换为如下的表结构: 
CREATE TABLE `kube_resource_version` ( 
  `one_row_id` tinyint(1) NOT NULL DEFAULT '1', 
  `resource_version` varchar(255) DEFAULT NULL, 
  PRIMARY KEY (`one_row_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
1.2.3.4.5.6.7.8.9.10.11.12.

如果查看在线业务的实际数据如下:

mysql> select * from kube_resource_version; 
+------------+------------------+ 
| one_row_id | resource_version | 
+------------+------------------+ 
|          1 |                  | 
+------------+------------------+ 
1 row in set (0.01 sec) 

看起来这个boolean类型真是有些鸡肋,在数据库中已经默认使用tinyint(1)来间接转义了,但是实际上还是不对味。

带来的问题是在MySQL 5.7中可以成功创建,但是在8.0会报错:

CREATE TABLE kube_resource_version (one_row_id BOOL NOT NULL DEFAULT true, resource_version VARCHAR(255), PRIMARY KEY (one_row_id), CONSTRAINT kube_resource_version_one_row_id CHECK (one_row_id), CHECK (one_row_id IN (0, 1))); 
ERROR 3812 (HY000): An expression of non-boolean type specified to a check constraint 'kube_resource_version_one_row_id'. 
1.2.

而经过分析,其实8.0的报错提示更加合理,至少我觉得8.0对于数据层面的要求确实变高了。

5.其他差异

5.1 int字段类型的差异

比如下面的建表语句,在 5.7 能正常执行:

CREATE TABLE `t1` ( 
`id` int(11) NOT NULL auto_increment,
`a` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

但是在 8.0.17 开始后的版本,执行上面的建表语句,会有如下 warnings:

Integer display width is deprecated and will be removed in a future release.

在上面的建表语句中,int(11) 中的 11 表示最大显示宽度,从 MySQL 8.0.17 开始,int 类型就不推荐使用显示宽度这个属性了。因此 8.0 建议使用单独的 int 来定义整数数据类型,如下:

CREATE TABLE `t1` ( 
`id` int NOT NULL auto_increment,
`a` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5.2 创建用户和赋权差异

MySQL 5.7,可以直接使用 grant 命令,用户和赋权都能完成。

grant select on test.* to 'test_user'@'127.0.0.1' identified by 'ddafsduGdsag';

8.0 版本下不 create user 的情况下执行 grant 会报如下错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'ddafsduGdsag'' at line 1

因此 MySQL 8.0 如果需要创建用户并赋权,必须要先 create user,再执行 grant 命令,操作如下:

create user 'test_user'@'127.0.0.1' identified with mysql_native_password by 'ddafsduGdsag'; 
grant select on test.* to 'test_user'@'127.0.0.1';

6.MySQL下载

最后附上MySQL5.7版本以及MySQL8版本的下载,大家按需下载吧。

MySQL5.7: 5.7

MySQL8: 8

7.参考文献

  • https://www.mysql.com/cn/why-mysql/

  • https://www.jianshu.com/p/bc13c572c517

  • https://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html

  • https://zhuanlan.zhihu.com/p/58706113

8.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

ToLeoJavaer公众号 (微信搜索程序员Leo)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/152418.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用CycleGAN训练自己的数据集

一、下载源码 源码下载链接:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 二、调整自己的数据集格式 按照如下格式放 三、安装好所需要的python包 使用命令:pip install 包名称 在anaconda里面安装, 四、训练和测试 在开始训…

【算法】最短路径——弗洛伊德 (Floyd) 算法

目录 1.概述2.代码实现3.扩展3.应用 1.概述 (1)弗洛伊德 (Floyd) 算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与 Dijkstra 算法类似。该算法名称以创始人之一、1978 年图灵奖获得者、…

应用在智能照明系统中的LED防蓝光灯珠

智能照明系统是利用电磁调压及电子感应技术,对供电进行实时监控与跟踪,自动平滑地调节电路的电压和电流幅度,改善照明电路中不平衡负荷所带来的额外功耗,提高功率因数,降低灯具和线路的工作温度,达到优化供…

到手价的低价监测怎么做到

品牌在做数据监测时,要考虑是否是到手价的监测,如果只是监测页面价的低价,真实情况是会漏掉很多的低价数据,如果是做经销商的低价监测工作,这样的监测方式下的数据会降低品牌对渠道的掌控力,因为监测的不是…

PPP协议_基础知识

ppp协议 点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。 一.ppp协议的组成 PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成: 对各种协议数据报的封装方法(封装成帧)链路控制协议LCP    …

揭秘2023年最热门的跨境电商源码趋势,你不能错过的关键信息

随着全球市场的不断扩大和国际贸易的加速,跨境电商源码正成为越来越多企业的首选。在本文中,我们将揭秘2023年跨境电商源码的最新趋势,为您带来关键信息,帮助您抓住机遇,实现商业成功。 2023年跨境电商源码趋势解析 …

JS-项目实战-鼠标悬浮设置字体颜色以及控制键盘输入

1、fruit.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格的所有的行&a…

Go 使用Viper处理Go应用程序的配置

在开发Go应用程序时,处理配置是一个常见的需求。配置可能来自于配置文件、环境变量、命令行参数等等。Viper是一个强大的库,可以帮助我们处理这些配置。 什么是Viper? Viper是一个应用程序配置解决方案,用于Go应用程序。它支持JS…

推介会如何做好媒体宣传

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式,旨在促进交流活动,形成合作,从而带来共同利益。推介会的本…

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

目录 一、cenc-aes-ctr 原理介绍 二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr 三、加密工具---ffmpeg 四、播放---ffplay 五、总结 ​​​​​​​一、cenc-aes-ctr 原理介绍 加密算法:CENC-AES-CTR 使用 AES(Advanced Encryption Standard&…

微服务架构学习与思考

参考:微服务架构学习与思考(01):什么是微服务?微服务的优势和劣势 - 九卷 - 博客园 (cnblogs.com) 一、单体应用 在软件开发早期阶段,大家都在一个应用系统上开发。各个业务模块之间耦合也比较紧密。软件发布也是整体发布&#…

实验室LIMS系统 asp.net源码 lims系统源码

LIMS系统是以实验室为中心,将人员、仪器、试剂、方法、环境、文件等影响分析数据的因素有机结合,针对实验室的要求,遵循ISO 17025准则,采用先进的计算机网络技术、数据存储技术、快速和强大的数据处理技术来对实验室进行全面管理的…

【备忘】websocket学习之挖坑埋自己

背景故事 以前没有好好学习过websocket,只知道它有什么用途,也知道是个好东西,平时在工作中没用过,所以对它并不知所以然。如今要做个自己的项目,要在付款的时候实时播报声音。自己是个开发者,也不想用别人…

【XTDrone Ubuntu20.04】XTDrone+ Ubuntu20.04 + PX4安装

XTDrone仿真平台配置 文章目录 XTDrone仿真平台配置依赖安装 ROS一键安装Marvos安装PX4 安装安装QTGroundControlXTDrone下载安装 环境: VMWare 16.0 Ubuntu 22.04 (因为没人配过)Ubuntu 20.04 参考文章: 仿真平台基础配置 (yuq…

还有医学生不知道这个免费好用的在线样本量计算器吗?

相信很多小伙伴都有过这样的经历:做科研设计、撰写论文,设计好主题后摆在眼前的是你最头痛的问题——样本量计算。事实上,样本量计算往往是临床医生做临床研究设计的一大障碍,是临床研究设计、临床知识经验以及统计学知识的结合。…

adguarg通过dns代理全局过滤广告,全系统操作指南

路由器dns配置 安卓(鸿蒙) 设置>>其他网络与连接>>私人DNS(不同手机系统设置名称会有些许出入,但是大差不差) (左图鸿蒙):将域名m.centos.chat填入手机私人DNS IOS系统 将代理服务器IP&am…

React-Router源码分析-History库

history源码 history 在 v5 之前使用单独的包, v6 之后再 router 包中单独实现。 history源码 Action 路由切换的动作类型,包含三种类型: POPREPLACEPUSH Action 枚举: export enum Action {Pop "POP",Push &quo…

核心容器中bean的操作

bean配置 bean基础配置 bean别名配置 **注意事项:**获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException(NoSuchBeanDefinitionException:No bean named ‘bookServiceImpl’ …

多GPU训练大型模型:资源分配与优化技巧 | 英伟达将推出面向中国的改良芯片HGX H20、L20 PCIe、L2 PCIe

★大模型、人工智能;数据并行;模型并行;流水线并行;混合精度训练、梯度累积;模型卸载CPU;重算;模型压缩;内存优化版优化器;Nvidia;A100;H100;A800…

Nutz框架如何自定义SQL?

Nutz框架基本的简单sql已经封装了,但是一些叫为复杂的sql需要手动去写,那如何实现像Mybatis那样通过配置文件编写呢?如有不明白详见官方文档:自定义 SQL - Nutzhttps://nutzam.com/core/dao/customized_sql.html#ndoc-4 一 新建…