Mysql8.0新特性

一,redo log重构

(涉及写入缓存的点:redo log 8.0之前通过两个锁及队列的方式保证数据的一致性,8.0之后,去掉锁,采用了区间的方式,区间内的所有日志是原子性的,都是串行化执行,以此来提高性能)
redo log是重做日志,提供前滚操作,他是innodb事务日志的一部分,另一部分是undo log,提供回滚操作。
redo log是一种物理日志,记录的是数据页的物理修改,而undo是行记录。
redo log分为两部分,一是写入内存的日志,二是从内存写入磁盘的日志。
在8.0版本以前,这两部分日志在写入时都需要加锁,也是性能瓶颈所在,而MySQL8.0版本去掉了这个锁,采用异步操作,用户线程只需要把日志写入缓存,刷盘的操作由其他的线程完成,提高了整体的运行效率。
对于InnoDb存储引擎,Redo Log的处理是实现事务持久性的关键,在MySQL 5.7 及以前,通过两个全局锁,实际上使MTR的提交过程串行化保证了RedoLog以及脏页处理的正确性,这使得MTR的提交过程因为锁竞争的缘故无法充分的发挥多核的优势。8.0 中通过引入的 Link_buf 数据结构将整个模块变成了 Lock_free 的模式,必然会带来性能上的提升。

二,原子DDL

(DDL操作,8.0之后开启原子性)
简洁的来看就是这样,有一个sql:
DROP TABLE table1,table2;
如果删除了table1之后服务挂了,
8.0之前:table1成功删除,table2没有删除。非原子操作。
8.0之后:table1和table2都不会删除。原子操作。
暂时只有innoDB引擎支持原子DDL。

三,直方图

(类似索引,提高查询等操作的性能)
MySQL中的直方图实际上是对表的某个字段数据分布的统计,借此可以向查询优化器提供更精确的字段信息,帮助优化器得到更优的查询计划。

四,Hash Join

(提供hash join 以供两个表在关联时没有提供索引来使用的)
Hash Join可以在被驱动表没有索引的情况下进行快速的连接并查询。

五,降序索引

image.png
MySQL8.0开始真正支持降序索引,之所以说是真正,是因为相关的语法在之前的版本中就出现了,像这样的:
ALTER TABLE tableA ADD INDEX indexA (columnA desc) ;
但是实际上8.0之前MySQL会忽略这个desc的定义,依然创建一个普通的升序索引。
对于单个字段的索引,升序索引和降序索引其实差不多,因为索引的数据结构是个B+树,一个升序索引倒着查询就能当降序索引用,效率比正着查低一点。
降序索引的意义:
引入降序索引后,降序查询的效率和正序可以一致了。
降序索引的另一项重要意义在于联合索引,可以应对一个sql中有的字段升序排列有的字段降序排列的场景。

举个例子:
当我们建立一个包含两个字段的联合索引:
ALTER TABLE tableA ADD INDEX indexA (columnA, columnB) ;
显然索引中的两个字段都是升序索引,那么我们使用下面的sql查询:
select * from tableA order by columnA asc, columnB desc;
上面建立的索引会被用到,MySQL会给columnB做一个排序操作,优化器会在Extra字段中展示:
Using index; Using filesort。
所以,如果我们对columnA使用升序索引,columnB使用降序索引:
ALTER TABLE tableA ADD INDEX indexA (columnA, columnB desc) ;
再次执行上面的查询语句,MySQL8.0就不会再进行排序了,explain之后的结果里Extra字段也只会有:
Using index
注意:
暂时只有InnoDB引擎支持降序索引。
降序索引只能用于BTREE索引,不能用于Hash索引。

六,隐藏索引

所谓隐藏索引,意思就是建了索引之后可以设为隐藏,不让查询优化器用。
设置隐藏索引和非隐藏索引使用的是INVISIBLE和VISIBLE关键字。
隐藏索引可以用来测试索引效率,比不断新增删除索引效率高的多。
主键索引不能被设为隐藏。
当一个表没有显式定义主键索引,而且有一个NOT NULL的列有UNIQUE索引时,第一个这种UNIQUE索引不能被设为隐藏索引:
CREATE TABLE t2 (
i INT NOT NULL,
j INT NOT NULL,
UNIQUE j_idx (j)
) ENGINE = InnoDB;
mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;
ERROR 3522 (HY000): A primary key index cannot be invisible.
把主键索引设为隐藏索引时也会有这个提示。
上面的场景,先给表加个主键索引,然后这个UNIQUE索引就可以被设为隐藏了。
建表语句中的sql是这样的:
CREATE TABLE t1 (
i INT,
j INT,
k INT,
INDEX i_idx (i) INVISIBLE
) ENGINE = InnoDB;
CREATE INDEX j_idx ON t1 (j) INVISIBLE;
ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;
修改表语句中的sql是这样的:
ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE;
ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;
查看索引是否是隐藏的,可以从INFORMATION_SCHEMA.STATISTICS表中获取,或从SHOW INDEX获取:
mysql> SELECT INDEX_NAME, IS_VISIBLE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = ‘db1’ AND TABLE_NAME = ‘t1’;
±-----------±-----------+
| INDEX_NAME | IS_VISIBLE |
±-----------±-----------+
| i_idx | YES |
| j_idx | NO |
| k_idx | NO |
±-----------±-----------+
系统变量optimizer_switch中有个use_invisible_indexes参数,默认为off,当他被设置为on时,即使索引被设为隐藏的,优化器也会使用这个索引

七,InnoDB读锁优化

MySQL8.0的读锁优化涉及两组概念:
1,SELECT FOR SHARE和SELECT FOR UPDATE
2,NOWAIT 和SKIP LOCKED
下面分别介绍。
SELECT FOR SHARE和SELECT FOR UPDATE
SELECT FOR SHARE是共享锁的查询,此查询的行不可以被别的事务修改,但是别的事务可以查询这些行。这种写法可以替换之前的SELECT LOCK IN SHARE MODE,其实功能是一样的,不过这种查询可以和NOWAIT 和SKIP LOCKED一起使用。
SELECT FOR UPDATE是排他锁的查询,此查询的行不可以被别的事务查询或修改。这种语法在之前的MySQL版本中就存在。这种查询可以和NOWAIT 和SKIP LOCKED一起使用。
注:
如果子查询的中没写SELECT FOR UPDATE,那么子查询中的行不会被锁,比如:
SELECT * FROM t1 WHERE c1 = (SELECT c1 FROM t2) FOR UPDATE;
这个sql中t2表的行不会被锁。
NOWAIT 和SKIP LOCKED
MySQL8.0新增的语法,这两种语法是和SELECT FOR SHARE或SELECT FOR UPDATE一起使用的。
在不NOWAIT 和SKIP LOCKED的情况下,被SELECT FOR SHARE或SELECT FOR UPDATE锁定的行是不能被其他事务用SELECT FOR SHARE或SELECT FOR UPDATE语法再次锁定的,而NOWAIT 和SKIP LOCKED这两种语法提供了其他的解决方案:
NOWAIT :如果查询结果中有被锁定的行,则直接返回错误。此方法不存在锁的等待。
SKIP LOCKED,如果查询结果中有被锁定的行,则忽略这些被锁定的行,返回那些没被锁定的行。此方法不存在锁的等待。
注:
NOWAIT 和SKIP LOCKED只对行级锁有效。

八,窗口函数

MySQL8.0引入的窗口函数,可以比较方便的实现一些分析和统计功能,这些功能不用窗口函数也能实现,不过可能sql会比较复杂。

mysql8.0-窗口函数详细代码示例

九,新的优化器提示 SET_VAR

MySQL8.0.3加入的SET_VAR,是一种新的优化器提示,可以在一条sql中修改session级的系统变量,sql执行完后系统变量就会恢复。
这是一种注释模式的优化器提示,这种模式在注释中的第一个字符必须是加号+。
如果我们只想在一个sql中使用不同的系统变量值,在以前是这样执行的:

SET @old_optimizer_switch = @@optimizer_switch;
SET optimizer_switch = 'mrr_cost_based=off';
SELECT * FROM t1;
SET optimizer_switch = @old_optimizer_switch;
-- 使用SET_VAR就是这样的:
SELECT
/*+ SET_VAR(optimizer_switch = 'mrr_cost_based=off') */ *
FROM t1;

显然sql简洁了很多。

可以同时修改多个系统变量的值:

SELECT
/*+ SET_VAR(optimizer_switch = 'mrr_cost_based=off')
SET_VAR(max_heap_table_size = 1G) */ *
FROM t1;

十,字符集优化

MySQL8.0开始支持Unicode9.0。
Unicode9.0新增支持了7500中新字符,包括72种emoji表情。另外还支持了一些小语种,其中一种是中国古代的西夏语。
MySQL8.0的默认符集改为utf8mb4。可以放心大胆的用emoji表情了。

十一,binlog复制优化

8.0版本使用WriteSet,对binlog的复制进行了优化,效率得以提高。

十二,持久化AUTO_INCREMENT值

MySQL8.0版本修复了这个bug,表的AUTO_INCREMENT被持久化了,任意时间MySQL服务重启,AUTO_INCREMENT值都会正确的加1,以前版本重启后为当前数字

在8.0版本之前,表的AUTO_INCREMENT值是存在内存中的,没有持久化到磁盘中,所以会出现这样的情况:

1,向表中插入3条记录,不指定id,则id自增为1,2,3。
2,删除id为3的行。
3,重启MySQL服务。
4,向表中插入一条记录,不指定id,则新增的这条记录的id将会是3,和之前一条记录的id重复。

这种id会重复的情况被记录在bug#199下,有些情况下这个bug还是很烦人的,比如把主键当业务主键的场景(业务主键理论上不应该重复),或者数据归档的场景:
1,向表A中插入3条记录,不指定id,则id自增为1,2,3。
2,把表A的数据整体归档到表B,于是表A中无数据,表B中有3条数据。
3,重启MySQL服务。
4,再向表A中插入一条记录,id就会是1。于是这个表A以后也别想再归档了。

十三,JSON语法

8.0版本开始正式支持JSON相关的语法,提供了JSON格式的数据库字段类型,制定了JSON格式相关的规则,添加了大量的JSON相关的函数。

常用Json函数

mysql8.0-窗口函数详细代码示例

常用Json函数

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

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

相关文章

神经网络:激活函数的介绍

神经网络的激活函数是一种非线性函数,它被应用于每个神经元的输出,以引入非线性性质到网络中。 激活函数的目的是将输入转换为输出,并且将输出限制在特定的范围内。它们非常重要,因为线性变换(例如加法和乘法&#xf…

听GPT 讲Rust源代码--compiler(4)

File: rust/compiler/rustc_codegen_gcc/src/back/mod.rs rust/compiler/rustc_codegen_gcc/src/back/mod.rs 文件是 Rust 编译器的源代码中的一个模块,主要负责与 GCC(GNU 编译器集合)相关的后端代码生成。 在 Rust 编译器的架构中&#xff…

从“五力”看百亿西凤的必然性

执笔 | 文 清 编辑 | 萧 萧 2023年末,西凤成功突破市场阻碍、跑赢行业周期,正式跻身中国百亿白酒品牌阵容。这是一份全行业及全体西凤人“预期之内”的成绩单。 当下,中国白酒已经进入“存量竞争”时代,马太效应使得强者恒强…

Minitab 各版本安装指南

Minitab下载链接 https://pan.baidu.com/s/1PLqocknkoRGGI9lbV3e45A?pwd0531 1.鼠标右击【Minitab 21(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)选择【解压到 Minitab 21(64bit)】。 2.打开解压后的文件夹,鼠标右击【setu…

集群容器频繁OOMKilled的排查经历

背景 我司采用的是k8s治理编排容器服务 出现的问题:线上某个应用pod频繁重启,13天内每个pod重启约8~9次 排查步骤 1.查看pod重启原因和重启时间点 kubectl describe pods okr-indicator-deploy-84bc5779c-55xsn -n rishiqing-v2 State: …

【Proteus仿真】【51单片机】超声波测距系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用动态数码管、按键、HCSR04超声波、蜂鸣器模块等。 主要功能: 系统运行后,数码管显示超声波检测距离,当检测距离…

报告解读:中国新一代终端安全市场洞察,2023

报告解读 中国新一代终端安全市场洞察 2023 安全防御的“最前线” 01 混沌的企业安全 以下来自CSO们最关注的安全热点问题: Q1我们如何看待当下泛化的终端安全,混合的IT环境企业面临的安全变化? IDC:伴随着全球数字化转型的快…

【番外】【Airsim in Windows ROS in WSL2-Ubuntu20.04】环境配置大全

【番外】【Airsim in Windows &ROS in WSL2-Ubuntu20.04】环境配置大全 【前言(可省略不看)】1.在windows上面部署好UE4AirSim联合仿真环境2.在windows上面部署wsl2系统以及在wsl2上面部署ubuntu系统3.安装好ubuntu系统之后,目前只能在命…

Multipath多路径管理基础介绍与安装配置使用

0x00 前言简述 Q:什么是Multipath多路径? 答:Multipath I/O 电脑储存技术,指利用两个以上的路径同时在CPU与储存设备之间传送讯号,以达到侦错与强化效能的目的。 简单的说当服务器到某一存储设备有多条路径时,每条路径都会识别为一个单独的…

清风数学建模-数学规划模型

内容:数学规划模型(cab aeqbeq lbub) 一.题型类型 1.线性规划linprog 2.非线性规划 fmincon 3.整数规划 intlinprog 4.(0-1规划)(特殊的线性整数规划)intlinprog 5.多目标规划 linprog 标…

[DevOps-05] Jenkins实现CI/CD操作

一、简要说明 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 二、准备Springboot工程 1、IDEA新建工程 2、填写项目工程信息 3、选择Springboot版本…

【数据结构】数组实现队列(详细版)

目录 队列的定义 普通顺序队列的劣势——与链队列相比 顺序队列实现方法: 一、动态增长队列 1、初始化队列 2、元素入队 3、判断队列是否为空 4、元素出队 5、获取队首元素 6、获取队尾元素 7、获取队列元素个数 8、销毁队列 总结: 动态增长队列…

配网故障定位技术的研究与实现:提高配网运行效率的必要手段

随着电力系统的不断发展,配电网作为电力系统的重要组成部分,其安全性和稳定性对于整个电力系统的运行具有重要意义。然而,配电网在运行过程中,由于各种原因导致的故障事件时有发生,严重影响了配网的运行效率和供电质量…

【单片机 TB作品】节拍器,电子音乐节拍器,51单片机,Proteus仿真

节拍器的使用可以使练琴者正确掌握乐曲的速度,从而使音 乐练习达到事半功倍的效果。本课题基于单片机设计具有声光晋 示的电子乐器节拍器,充分利用单片机的定时和中断系统,通过 C语言程序设计,控制外部相关硬件电路,实现对音乐速,度 40~120次/分钟范围内连续可调,节拍114、 2/4…

解决sublime中文符号乱码问题

效果图 原来 后来 问题不是出自encode文件编码,而是win10的字体问题。 解决方法 配置: { "font_face":"Microsoft Yahei", "dpi_scale": 1.0 } 参考自 Sublime 输入中文显示方框问号乱码_sublime中文问号-CSDN博…

学习调整echarts中toolbox位置toolBox工具栏属性

学习调整echarts中toolbox位置toolBox工具栏属性 toolbox工具栏属性介绍示例代码代码参数说明 toolbox工具栏属性介绍 参考网址:https://echarts.apache.org/zh/option.html#tooltip 属性类型说明toolbox.showbooleanboolean 默认值为true,是否显示工具…

Matlab进阶绘图第37期—多色悬浮柱状图

多色悬浮柱状图是一种特殊的柱状图。 与常规柱状图相比,多色悬浮柱状图可以通过悬浮的矩形展示最小值到最大值的范围(或其他范围表达),并通过颜色进行美化/区分/附加信息。 本文使用自己制作的Floatingbar小工具进行多色悬浮柱状…

Oracle database 12cRAC异地恢复至单机

环境 rac 环境 byoradbrac Oracle12.1.0.2 系统版本:Red Hat Enterprise Linux Server release 6.5 软件版本:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1:172.17.38.44 byoradb2:172.17.38.4…

Kotlin采集美团商家信息 同行竞争价格监控

“南方小土豆”挤爆哈尔滨旅游市场,一个冬天让哈尔滨火出了圈,让全国观众看见了不一样的逆向旅游热,虽说我心驰神往,但是无奈加班敲代码,连休息的时间都没有。前段时间我通过用java写了一个美团爬虫程序,今…

智慧工厂:科技与制造融合创新之路

随着科技的迅猛发展,智慧工厂成为制造业领域的热门话题。智慧工厂利用先进的技术和智能化系统,以提高生产效率、降低成本、增强产品质量和灵活性为目标,正在引领着未来制造业的发展。 智慧工厂的核心是数字化和自动化生产,相较于传…