详解GaussDB for MySQL性能优化


Posted in MySQL onMay 18, 2021

背景

我们先来看看MySQL 8.0的事务提交的大致流程

详解GaussDB for MySQL性能优化

以上流程,是MySQL8.0对WAL原则的一种实现,这个流程意味着,任何一个事务的提交,一定要完成write buffer和flush to disk流程。

然而那么这个流程中,有一个问题:每个服务器的CPU是有限的,服务器能处理的Thread也是有上限的,那么当我们的业务的并发数量,远远大于我们服务器能并行处理的数量时,那么后来的事务,只能等待前面的事务提交后才能被处理。在这之前,他们什么也做不了。因此,在大并发场景下,如何进一步提升线程的使用率,是大并发事物写入的一个关键。

灵感来源于生活

一个优化,并不是凭空想象出来的,有时候,往往来源于现实生活。下面,我们先来看看我们身边,和事务提交流程非常类似的一个例子:快递。

现在的快递配送,一般一个快递员会负责一片区域,快递刚开始兴起时,数量不多,那么一个快递员基本上可以在规定时间内完成配送。

详解GaussDB for MySQL性能优化

但是,随着快递数量越来越多,一个快递员要在一个小区配送很长的时间,才能到下一个小区,常常导致了快递员无法准时的配送。在这个问题的催动下,随后,一个新的行业开始出现 ? 快递驿站。

详解GaussDB for MySQL性能优化

快递的优化原理

接下来,让我们来看下,快递驿站究竟解决了什么问题。

快递的配送过程中,最耗时的,不是装货,不是卸货,而是电话和等待。配送一个小区的时间,取决于这个最后一个来取快递的人的时间,在最后一个人取完快递钱,快递员除了打电话,做不了其他任何事情(也没有办法通知下一个小区的人,因为最后一个人来取得时间是无法确定的)。那么这个等待的时间,对于快递员来说,就是一种浪费。

快递驿站可以很大程度解决这个问题,快递员到了以后,只需要将快递卸货,即可前往下一个小区,剩下的事情,就可以由驿站的人员来完成,大大提升了快递员的配送效率。

分析

回过头来,我们看看数据库,如果把Transaction线程看做快递员,存储上的文件看做取快递的人,那么我们会发现两者有非常大的相似性。那么我们可以像快递配送优化那样去优化事务的处理流程吗?答案是可以的。

详解GaussDB for MySQL性能优化

根据快递驿站的优化原理,我们知道,快递驿站帮快递员免去了等待客户取货的时间,那么事务处理过程中,有没有等待的过程呢?答案是有的,存储的IO就是一个较长的等待。数据库使用经验丰富的开发人员来都知道,等待redo日志写入存储的磁盘IO性能,很大程度上决定了数据库的写入性能。对于现代数据库来说,尤其对于GaussDB(for MySQL)这样计算于存储分离的数据库,存储的IO耗时,在事务处理的总耗时中,占据了不小的比例,虽然有log buffer的合并写入,提升并发情况下的整体吞吐,但是如果在等待IO的这段时间中,这些线程能够去做别的事情(例如处理等待中的其他事务)。那么将会有进一步的性能提升。

GaussDB(for MySQL)的优化

既然找到了等待的点,那么我们就可以像快递配送的优化方法,为数据库,也创造一个“快递驿站”,让“快递驿站”来做等待的事情,而事务线程就可以去处理其他等待中的事务,让CPU不会“闲下来”。

详解GaussDB for MySQL性能优化

如图5所示,GaussDB(for MySQL)当redo日志的flush to disk动作完成后,即可进行事务提交,但是此时并不应答客户端,而是直接处理下一个事务。同时使用少量”post comit worker线程”,来批量等待日志写入完成(等待的过程其实并不占用CPU),并应答客户端,这就可以让“等待”和“下一个事务的处理”并行化,让CPU“闲不下来”。

实际测试

详解GaussDB for MySQL性能优化

根据实际测试,在标准的sysbench写入模型下,没有使用Post Commit时,极限性能是35万QPS左右,而使用Post commit后,可以到大42万以上的QPS,提升了20%的写入性能。

以上就是详解GaussDB for MySQL性能优化的详细内容,更多关于GaussDB for MySQL性能优化的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
mysql部分操作
Apr 05 MySQL
MySQL复制问题的三个参数分析
Apr 07 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
May 08 MySQL
详解MySQL的Seconds_Behind_Master
May 18 #MySQL
MySQL优化之如何写出高质量sql语句
May 17 #MySQL
mysql数据库入门第一步之创建表
MySQL 隔离数据列和前缀索引的使用总结
May 14 #MySQL
MySQL 使用自定义变量进行查询优化
May 14 #MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 #MySQL
MySQL 可扩展设计的基本原则
May 14 #MySQL
You might like
也谈 PHP 和 MYSQL
2006/10/09 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
php取得字符串首字母的方法
2015/03/25 PHP
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python的类方法和静态方法
2014/12/13 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
利用Python开发实现简单的记事本
2016/11/15 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
Python代码实现KNN算法
2017/12/20 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
Puma印度官网:德国运动品牌
2019/10/06 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
数控专业大学生的自我鉴定
2013/11/13 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
开学典礼主持词
2014/03/19 职场文书
赔偿协议书范本
2014/04/15 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL