当前位置: 首页 > web >正文

MySQL8新特性底层原理

降序索引

什么是降序索引

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 避免了复制和重新组织整个表的需要,从而实现了更快的列添加操作。


推荐阅读

事务底层与高可用原理

http://www.xdnf.cn/news/7043.html

相关文章:

  • 淘宝商品主图标题api接口(附API接口文档)
  • Linux - 2.系统命令
  • MySQL 高级查询:JOIN、子查询、窗口函数
  • 搭建一个WordPress网站需要多少成本
  • QML元素 - ZoomBlur
  • 内核链表常用接口的一些理解
  • 2025/517学习
  • No More Adam: 新型优化器SGD_SaI
  • MySQL Workbench 工具导出与导入数据库:实用指南
  • 文件共享ftb
  • 多平台屏幕江湖生存指南
  • MongoDB聚合查询:从入门到精通
  • 现代健康生活养生指南
  • nodejs 文件的复制
  • 【人工智能】微调的艺术:将大模型塑造成你的专属智能助手
  • 大模型技术演进与应用场景深度解析
  • Type-C连接器:数字时代接口革命的终极答案
  • C语言中字符串函数的详细讲解
  • 2025年数字孪生技术最新应用案例:跨领域实践与技术趋势
  • OpenAI新发布Codex的全面解析
  • C语言输入函数对比解析
  • GPIO点亮LED
  • 使用UniApi调用百度地图API的需要注意的地方
  • 基于 jQuery 的轻量级在线画册、电子书、产品目录插件及使用
  • 粒子群算法(PSO算法)
  • RAGFlow Arbitrary Account Takeover Vulnerability
  • 广东省省考备考(第十三天5.17)—言语:中心理解题(听课后强化练习)
  • 3、ubantu系统 | 通过vscode远程安装并配置anaconda
  • C++中析构函数不设为virtual导致内存泄漏示例
  • 电子电路:电位器和可变电阻是同一个东西吗?