前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >truncate语法在大buffer pool下面的优化

truncate语法在大buffer pool下面的优化

作者头像
AsiaYe
发布2020-09-21 15:21:42
8800
发布2020-09-21 15:21:42
举报
文章被收录于专栏:DBA随笔DBA随笔

truncate语法在大buffer pool下面的优化思路

MySQL5.7版本仍然是线上普及程度最广泛的版本,在实际的操作过程中,经常会出现truncate table引起的系统TPS、QPS不稳定的现象。

究其原因,truncate操作会删除buffer pool的数据页,在这个过程中,会对buffer pool加锁,从而影响buffer pool的读写访问。相比而言,drop table会比truncate table的操作快很多,其本质原因是truncate table 需要复用数据页的space id, 这导致必须把buffer pool中的老的表中的页全部删除,而drop table因为新旧表的页可用通过space id区分,只需要把flush list中的脏页删除就可以了,也就是可以用drop+create代替truncate来解决大buffer pool下的数据清理问题。

在MySQL8.0中,默认是使用drop+create的代码来实现truncate函数的,在MySQL5.7中,仍然是使用原生truncate方法,这里可以参考MySQL官网的一个bug讨论查看细节:

https://bugs.mysql.com/bug.php?id=68184

在开发的过程中,遇到大表的truncate的时候,不能简单的让DBA将truncate语法转换成drop + create,这两种方式在实现上还是有细微的不同的。表现在:

1、drop + create是2条SQL,中间存在时间间隔,可能导致业务报错

2、这条语句不是statement的

只有业务对于执行中间状态不敏感的时候,才可以使用drop+create的方法来代替truncate。

在MySQL5.7中,如果想要实现truncate的优化,同时为了保证truncate操作的安全,可以在源码中将truncate语句替换成rename+create,rename操作之后再将rename的临时表进行删除,这样可以保证truncate的执行效率。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档