✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: MySQL学习
✨特色专栏: MySQL专栏
🥭本文内容:MySQL5.7和MySQL8对比分析
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: 知识库,欢迎大家访问
✨✨ 粉丝福利订阅✨✨
大家好,我是Leo哥🫣🫣🫣,昨天有人问道:Leo哥,MySQL8安装咱也会了,绿色版,嘎嘎一顿操作,简单粗暴。能讲讲关于MySQL5.7和MySQL8之间的区别吗。于是就有了今天这篇文章。好了,话不多说让我们开始吧😎😎😎。
Oracle发布新版本的MySQL时,直接从5.7.x 跳到了 8.0,可谓是一个大的版本跳跃,当然也可以从侧面反映,这里面的功能会有不少的变化,新版本的MySQL增加了不少的亮点。
总体来说,各个业务表存储引擎为InnoDB的mysql 5.7在使用语法上和mysql 8.0差别不大,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能。
下面我们先通过两种图来看一下关于MySQL8中性能升级(图一)和Nosql文档升级(图二)
比如我们在MySQL 5.7版本中全面推行GTID,所以之前的create table xxx as select * from xx的使用模式就不奏效了,进而我们建议使用:
create table xxx like xxxxx; insert into xxx select * from xxxxx;
这种使用模式,而MySQL8.0带来的很多特性是在体验和性能改造方面,原来不建议使用的模式竟然可以支持了,而很多业务侧是后知后觉,原本已经培养的习惯,让我们有些凌乱。
在MySQL 5.7中字段名为rank是可以的,但是在8.0中因为有了窗口函数,字段名为rank就报错,顺着这个思路,其实我们一窥窗口函数。
这里顺便吐槽下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.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;
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';
最后附上MySQL5.7版本以及MySQL8版本的下载,大家按需下载吧。
MySQL5.7: 5.7
MySQL8: 8
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
以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。
如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。