首页 > 数据库 >MySQL8新特性底层原理

MySQL8新特性底层原理

时间:2024-07-24 21:25:55浏览次数:19  
标签:doublewrite MySQL8 降序 t2 特性 索引 MySQL c2 底层

降序索引

什么是降序索引

MySQL 8.0开始真正支持降序索引 (descendingindex) 。只有InnoDB存储引擎支持降序索引,只支持BTREE降序索引。另外MySQL8.0不再对GROUP BY操作进行隐式排序。

在MySQL中创建一个t2表

 create table t2(c1 int,c2 int,index idx1(c1 asc,c2 desc));
 ​
 show create table t2\G
 ​

image.png

如果是5.7中,则没有显示升序还是降序信息

image.png

我们插入一些数据,给大家演示下降序索引的使用

 insert into t2(c1,c2) values(1,100),(2,200),(3,150),(4,50);

image.png

看下索引使用情况

 explain select * from t2 order by c1,c2 desc;

image.png

我们在5.7对比一下

image.png

这里说明,这里需要一个额外的排序操作,才能把刚才的索引利用上。

我们把查询语句换一下

 explain select * from t2 order by c1 desc,c2 ;

MySQL8中使用了

image.png

另外还有一点,就是group by语句在 8之后不再默认排序

 select count(*),c2 from t2 group by c2;

image.png

image.png

在8要排序的话,就需要手动把排序语句加上

 select count(*),c2 from t2 group by c2 order by c2;

image.png

到此为止,大家应该对升序索引和降序索引有了一个大概的了解,但并没有真正理解,因为大家并不知道升序索引与降序索引底层到底是如何实现的。

降序索引的底层实现

升序索引对应的B+树

image.png

降序索引对应的B+树

image.png

如果没有降序索引,查询的时候要实现降序的数据展示,那么就需要把原来默认是升序排序的数据处理一遍(比如利用压栈和出栈操作),而降序索引的话就不需要,所以在优化一些SQL的时候更加高效。

还有一点,现在 只有Innodb存储引擎支持降序索引

Doublewrite Buffer的改进

MySQL5.7

image.png

MySQL8.0

image.png

在MySQL 8.0.20 版本之前,doublewrite 存储区位于系统表空间,从 8.0.20 版本开始,doublewrite 有自己独立的表空间文件,这种变更,能够降低doublewrite的写入延迟,增加吞吐量,为设置doublewrite文件的存放位置提供了更高的灵活性。

因为系统表空间在存储中就是一个文件,那么doublewrite必然会受制于这个文件的读写效率(其他向这个文件的读写操作,比如统计、监控等数据操作)

系统表空间(system tablespace)

这个所谓的系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1(在你的数据目录下找找看有木有)、大小为12M的文件,这个文件就是对应的系纳表空间在文件系统上的表示。

image.png

而单独的文件必然效率比放在系统表空间效率要高!!!

新增的参数:

innodb_doublewrite_dir

指定doublewrite文件存放的目录,如果没有指定该参数,那么与innodb数据目录一致(innodb_data_home_dir),如果这个参数也没有指定,那么默认放在数据目录下面(datadir)。

innodb_doublewrite_files

指定doublewrite文件数量,默认情况下,每个buffer pool实例,对应2个doublewrite文件。

innodb_doublewrite_pages

一次批量写入的doublewrite页数量的最大值,默认值、最小值与innodb_write_io_threads参数值相同,最大值512。

innodb_doublewrite_batch_size

一次批量写入的页数量。默认值为0,取值范围0到256。

redo log 无锁优化

MySQL :: MySQL 8.0: New Lock free, scalable WAL design

MySQL 8 中快速添加列的底层实现原理

MySQL 8 中快速添加列的底层实现原理是通过 InnoDB 存储引擎的 "Fast Index Creation" 特性实现的。该特性允许在大型表中高效地添加列,而无需重建整个表。 当向表中添加新列时,MySQL 8 使用一种称为 "in-place ALTER" 的技术,以修改表的元数据,而无需进行完整的表重建。在添加新列的情况下,InnoDB 存储引擎会创建一个 "不可见" 的表的副本,该副本包含了新列。然后,这个副本会以非阻塞的方式与原始表进行同步,使得正常的操作可以继续进行,而不会中断。 这种 "in-place ALTER" 技术利用了 InnoDB 的高效数据存储格式,该格式使用聚簇索引来物理存储数据。通过将新列作为聚簇索引的一部分添加,MySQL 8 避免了复制和重新组织整个表的需要,从而实现了更快的列添加操作。

标签:doublewrite,MySQL8,降序,t2,特性,索引,MySQL,c2,底层
From: https://blog.csdn.net/weixin_51568389/article/details/140534976

相关文章

  • java8interface的新特性:default,static,funcation
    default:默认方法在类接口中可以直接定义的方法,实现接口的类可以直接使用使用案例:publicinterfaceMyInterface{defaultvoiddisplay(){System.out.println("Thisisdefaultmethod.");}}说明:被default修饰的方法可以不被子类实现。即在......
  • NMEA2000在船舶控制系统中航空插头插座组件特性
    NMEA2000在船舶控制系统中的应用概述NMEA2000协议是船舶电子设备之间通信的国际标准,广泛应用于船舶导航、监控和自动化系统。它基于CAN(ControllerAreaNetwork)总线技术,以确保在恶劣环境下的可靠性和效率。NMEA2000协议定义了标准化的物理接口和通信协议,使得不同厂商生产的设......
  • redis原理之底层数据结构-跳表
    1.什么是跳表1.1链表及其不足链表是在程序设计中最常见的数据结构之一,它通过指针将多个链表节点连接起来,这样就可以将逻辑上同一类的数据存储到不连续的内存空间上。链表结构如下:但是链表有一个问题,就是当链表需要查询一个元素的时候,需要从链表头部开始遍历,时间复杂度为o(......
  • 深入理解Java虚拟机:JVM高级特性与最佳实践-第三章-垃圾收集器与内存分配策略
    在java内存运行时区域中的各个部分中,程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着回收了。但是Java堆和方法区这两个区域具有......
  • Newtonsoft 特性[JsonIgnore ] 对于继承属性的神奇效果
    阅读前请有点基础[JsonIgnore]publicDateTimeCreateTimccc{get;set;}一般用Newtonsoft序列化类时候,如果不要序列化这个属性,在上面加这个特性就好了(ps.这个特性和Newtonsoft和Text.Json的名称重复,注意不要搞错)定义子类和父类,用隐藏基类......
  • python面向对象三大特性(继承、多态、封装)之继承
    来吧,下面来具体说一下面向对象的三大特性:所谓封装、多态和继承。我们先来说一下继承。所谓继承,顾名思义,子类继承父类的属性,包括数据属性和函数属性。写个简单的例子吧:1.简单的继承classAnimal:need_substance='water'def__init__(self):print('这是一......
  • .NET Core使用AspectCore实现AOP,使用特性定义的方法拦截器未触发
    使用AspectCore.DynamicProxy.AbstractInterceptorAttribute定义方法拦截器publicclassTestAttribute:AbstractInterceptorAttribute{publicoverrideTaskInvoke(AspectContextcontext,AspectDelegatenext){try{......
  • Redis底层数据结构-简单动态字符串SDS
    简单动态字符串(simpledynamicstring,SDS)。Redis没有直接使用C语言传统的字符串,而是自己构建了一种简单动态字符串(SDS)的抽象类型。C字符串只会作为字符串字面量(stringliteral)用在一些无须对字符串值进行修改的地方。实现sds.h/sdshdrstruct__attribute__((__packed__)......
  • MySQL事务管理详解:特性、问题与解决方案
    什么是事务?事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。事务的四大特性原子性(Atomicity)原子性意味着事务中对数据库的一系列操作要......
  • 去趋势波动分析方法-捕捉时间序列数据在不同尺度上的变化特性
    前言近年来,降水过程中的分形行为和长期相关性成为了一个活跃的研究领域。这些研究表明,降水数据中存在分形行为,但分形理论在实际应用中仍然不够充分。传统方法的局限性:由于降水过程的非平稳性,传统的线性方法(如自相关函数分析或谱分析)在检测时间序列的这些属性时不可靠。非......