MySQL5。7和MySQL8。0的4个细节差异
在这些年的MySQL升级需求中,让我大跌眼镜的一个现象是:驱动业务从MySQL 5.5升级到MySQL 5.7的很大一个因素是因为JSON这个特性。
而让业务有所顾虑从MySQL 5.7升级到MySQL 8.0的一个主要原因是:驱动版本升级,所以对于MySQL 5.7升级到MySQL 8.0来说,总体的升级动力明显要低一些,但是规划的一个优点就是可以把一些工作前置,或者让它的推行更加顺畅,比如我们对于新业务的推行,都是默认按照MySQL 8.0的方案来做。
如果要说MySQL 5.7升级到MySQL 8.0的一些差异,从我的角度来说,其实变化是很大的,但是细数盘点,很多特性似乎是对于业务的一种友好或者透明支持。
细节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带来的很多特性是在体验和性能改造方面,原来不建议使用的模式竟然可以支持了,而很多业务侧是后知后觉,原本已经培养的习惯,让我们有些凌乱。
细节2:
在MySQL 5.7中字段名为rank是可以的,但是在8.0中因为有了窗口函数,字段名为rank就报错,顺着这个思路,其实我们一窥窗口函数。
其实就会发现不光是rank,字段名是first_value也不可以了,随之带来的就是SQL语法错误,可能会让人开始有点抓不着头脑。
create table test3(id int primary key,first_value varchar(30));
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 "first_value varchar(30))" at line 1
细节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;
如果查看在线业务的实际数据如下:
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".
而经过分析,其实8.0的报错提示更加合理,至少我觉得8.0对于数据层面的要求确实变高了。
细节4:
在MySQL里面如果对一张大表做delete,真是一件让人尴尬的事情,在MySQL 5.7里面有点后知后觉,在show processlist的输出中。State和Info列分别显示:
Executing event 和delete from xxxxx
同时Seconds_Behind_Master显示为0,实际上数据已经产生大量延迟了。
而相反在MySQL 8.0里面,State和Info列分别显示:
Applying batch of row changes (delete)和delete from xxxxx
可以明确的提示出批量操作,当然这延迟确实不体面,真是非常大。
简单小结:MySQL 8.0里面的很多细节还是很接地气,也不能潜意识的认为是100%兼容,要拍胸脯保证的事情,得有深入的测试和案例分析支撑。
双减后带娃有些啥变化?四位妈妈的切身感受,看看你跟谁更有共鸣每日商报讯今天要和大家分享四位杭州家长的故事,讲述他们在双减之后带娃生活的变化。这四位家长不可能代表全部家长,但希望通过他们的讲述,能让更多读者看到双减带来的心理和现实变化,看看你
怀孕之前应该做什么事情呢?我们国家一直在提倡优生优育,优生优育,对每一个家庭都是非常必要,也是非常重要的事情,你们知道准备怀孕前注意事项都有哪些吗,生活中大家都是怎么备孕的呢,今天就给大家详细介绍一下究竟孕
怀孕胖了三十多斤,宝妈们能来聊聊你们怀孕胖了多少斤吗?我怀孕胖了50斤,生完瘦了18斤,出院时瘦了25斤,今天20天瘦了35斤了一胎孕前八十多斤,怀孕一百一十多斤,生完没多久九十斤左右,后面又恢复八十多斤,二胎现在39,也是一百多,但
预产期真的准吗?准妈妈们要注意了,预产期可以提醒胎儿安全出生的时间范围,并不是精确的分娩日期。在医学上,足月儿是指胎龄在3742周之间出生的宝宝,这段时间分娩的宝宝大约是8090,不到37周就分娩
孩子上大学时,一般父母年龄都多大了?感谢邀请!说说几个身边的案例。最年轻的父母和最年长的父母,在他们孩子上大学时,差的可不是几岁十岁,可能是差两轮啊(24岁)。犹记得很多高校开学的动人一幕,为了送孩子上大学,但周边宾
孩子小学体育好,能吃苦,干活勤快,手脚玲利,今后怎样发展?谢邀。谈点浅见,请指正。每位家长都期望自己的孩子品德好,学习好,身体好。望子成龙,望女成凤是家长们的普遍期待。孩子上学,学校里要培养学生的目标是德智体全面发展。所有学校非常注重孩子
开学前根本不用收心科学育儿底层思维陶勇经常看到开学前很多家长在转发一些如何让孩子在开学前收心的文章,甚至还有些培训机构推出了收心的课外班,看到这种消息觉得不可思议。我认为根本不需要收心,没啥意义。一
寓教于乐,AI桌屏互动玩具套装背景儿子现在六岁半了,刚开始上幼儿园大班。为了让他以后能够更好地适应小学的学习生活,我们开始改变对他的教育方式,从之前的以玩为主,开始向适当学习转变,计划每天给他讲解并练习一些加减
托育中心标准化教案一般很多托育机构教学设计的环节分为保育教育,养育,三步流程。今天我来介绍一下托育的正确流程与方案例2527个月幼儿参考流程1掌握部分2,教学目标3教学内容4教学方式一般掌握部分基础
心理学家李玫瑾娃开始顶嘴时,父母多说这3句话,比打骂更有用父母都希望孩子对自己言听计从的,但是事实往往不是这样的。有一个粉丝曾经给我留言,说自己的儿子11岁了,上小学五年级,现在就学会了和父母顶嘴。他偷偷地玩手机,被发现以后恼羞成怒,指责
小儿积食不能喝牛奶?68岁儿科院士忠告真正不能吃的还有这3物小儿积食是最常见的小儿病症之一,虽然是个小病症,但要是就拖不治就会引发感冒发烧咳嗽等小病症还会出现哮喘肺炎等情况,甚至对孩子的生长发育产生影响,有不长肉不长个的现象。因此,小儿积食