详解GaussDB for MySQL性能优化
背景
我们先来看看MySQL 8.0的事务提交的大致流程
以上流程,是MySQL8.0对WAL原则的一种实现,这个流程意味着,任何一个事务的提交,一定要完成write buffer和flush to disk流程。
然而那么这个流程中,有一个问题:每个服务器的CPU是有限的,服务器能处理的Thread也是有上限的,那么当我们的业务的并发数量,远远大于我们服务器能并行处理的数量时,那么后来的事务,只能等待前面的事务提交后才能被处理。在这之前,他们什么也做不了。因此,在大并发场景下,如何进一步提升线程的使用率,是大并发事物写入的一个关键。
灵感来源于生活
一个优化,并不是凭空想象出来的,有时候,往往来源于现实生活。下面,我们先来看看我们身边,和事务提交流程非常类似的一个例子:快递。
现在的快递配送,一般一个快递员会负责一片区域,快递刚开始兴起时,数量不多,那么一个快递员基本上可以在规定时间内完成配送。
但是,随着快递数量越来越多,一个快递员要在一个小区配送很长的时间,才能到下一个小区,常常导致了快递员无法准时的配送。在这个问题的催动下,随后,一个新的行业开始出现 – 快递驿站。
快递的优化原理
接下来,让我们来看下,快递驿站究竟解决了什么问题。
快递的配送过程中,最耗时的,不是装货,不是卸货,而是电话和等待。配送一个小区的时间,取决于这个最后一个来取快递的人的时间,在最后一个人取完快递钱,快递员除了打电话,做不了其他任何事情(也没有办法通知下一个小区的人,因为最后一个人来取得时间是无法确定的)。那么这个等待的时间,对于快递员来说,就是一种浪费。
快递驿站可以很大程度解决这个问题,快递员到了以后,只需要将快递卸货,即可前往下一个小区,剩下的事情,就可以由驿站的人员来完成,大大提升了快递员的配送效率。
分析
回过头来,我们看看数据库,如果把Transaction线程看做快递员,存储上的文件看做取快递的人,那么我们会发现两者有非常大的相似性。那么我们可以像快递配送优化那样去优化事务的处理流程吗?答案是可以的。
根据快递驿站的优化原理,我们知道,快递驿站帮快递员免去了等待客户取货的时间,那么事务处理过程中,有没有等待的过程呢?答案是有的,存储的IO就是一个较长的等待。数据库使用经验丰富的开发人员来都知道,等待redo日志写入存储的磁盘IO性能,很大程度上决定了数据库的写入性能。对于现代数据库来说,尤其对于GaussDB(for MySQL)这样计算于存储分离的数据库,存储的IO耗时,在事务处理的总耗时中,占据了不小的比例,虽然有log buffer的合并写入,提升并发情况下的整体吞吐,但是如果在等待IO的这段时间中,这些线程能够去做别的事情(例如处理等待中的其他事务)。那么将会有进一步的性能提升。
GaussDB(for MySQL)的优化
既然找到了等待的点,那么我们就可以像快递配送的优化方法,为数据库,也创造一个“快递驿站”,让“快递驿站”来做等待的事情,而事务线程就可以去处理其他等待中的事务,让CPU不会“闲下来”。
如图5所示,GaussDB(for MySQL)当redo日志的flush to disk动作完成后,即可进行事务提交,但是此时并不应答客户端,而是直接处理下一个事务。同时使用少量”post comit worker线程”,来批量等待日志写入完成(等待的过程其实并不占用CPU),并应答客户端,这就可以让“等待”和“下一个事务的处理”并行化,让CPU“闲不下来”。
实际测试
根据实际测试,在标准的sysbench写入模型下,没有使用Post Commit时,极限性能是35万QPS左右,而使用Post commit后,可以到大42万以上的QPS,提升了20%的写入性能。
以上就是详解GaussDB for MySQL性能优化的详细内容,更多关于GaussDB for MySQL性能优化的资料请关注我们其它相关文章!
相关推荐
-
Mysql索引性能优化问题解决方案
mysql 创建的优化就是加索引,可是有时候会遇到加索引都没法达到想要的效果的情况, 加上了所以,却还是搜索的全数据,原因是sql EXPLAIN SELECT cs.sid, -- c.courseFrontTitle, -- c.imgBig, cs.studyStatus, coi.fee, -- act.PROC_INST_ID_ AS processId, cs.createDTM, cs.payStatus, cs.isCompleted, cs.saleChannel, cs.is
-
Mysql性能优化之索引下推
索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询. 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 . 在使用ICP的情况下,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出
-
MySQL性能突然下降的原因
有时会碰到这样的情况,一条 SQL 在平时执行没问题,很快.但是突然某个时间执行的就会很慢,而且这种场景并不能复现,只能随机发送的. SQL 执行突然变慢的原因 在之前讲解 MySQL Redo log 时,说到了 WAL 机制,为了保证 MySQL 更新的速度,在进行更新操作时,先将更新内容写入 redo log,后续系统空闲时,再将 redo log 的内容应用到磁盘. 当内存数据页(redo log)和磁盘数据页内容不一致时,将该内存也称为 "脏页".将内存数据写入到磁盘后,数据
-
MySQL 如何分析查询性能
查询优化.索引优化和表设计优化是环环相扣的.如果你有丰富的编写MySQL查询语句的经验,你就会知道如何设计表和索引来支持有效的查询.同样的,知晓表设计同样有助于了解表结构如何对查询语句产生影响.因此,即便表设计和索引都设计得很好,但如果查询语句写得很糟糕,那查询的性能也会很糟糕. 在尝试编写快速的查询语句前,务必记住快速都是基于响应时间进行评估的.查询语句是一组由多个子任务组成的大任务,每一个子任务都会消耗时间.为了优化查询,我们需要尽可能地减少子任务的数量,或者让子任务执行得更快. 注:有些时
-
MySQL20个高性能架构设计原则(值得收藏)
开源数据库架构设计原则 01. 技术选型 选择成熟的平台和技术,同时是最熟悉的,能做到极致的,用好不用坏,用熟不用生.目前业界的MySQL主流分支版本有Oracle官方版本的MySQL.Percona Server.MariaDB. 02. 高可用选择 高可用解决方案探讨的本质上是低宕机时间解决方案,可以理解成高可用的反面是不可用,绝大部分情况下数据库宕机才会导致数据库不可用.随着技术发展,开源数据库方面很多高可用组件(主从复制.半同步.MGR.MHA.Galera Cluster),对应场景,
-
MySQL性能优化技巧分享
MySQL性能优化 在互联网公司MySQL的使用非常广泛,大家经常会有MySQL性能优化方面的需求.整理了一些在MySQL优化方面的实用技巧. Schema与数据类型优化 整数通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT 完全"随机"的字符串(如:MD5().SHA1()或者UUID()等产生的字符串)会任意分布在很大的空间内,会导致INSERT以及一些SELECT语句变的很慢 如果希望查询执行得快速且并发性好,单个查询最好不要做太多的关联查询(互联网公
-
Mysql高性能优化技能总结
数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低) 数据库基本设计规范 1
-
MySQL性能压力基准测试工具sysbench的使用简介
1.sysbench介绍 这里介绍一款MySQL数据库的压力测试软件sysbench,用它来进行基准测试. sysbench 是一个开源的.模块化的.跨平台的多线程性能测试工具, 可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试. 目前支持的数据库有MySQL.Oracle 和PostgreSQL. #项目下载地址: https://launchpad.net/sysbench http://github.com/akopytov/sysbench 该基准套件的想法是快速获得有关系统
-
MySQL创建高性能索引的全步骤
一.索引基础 1. 索引的类型 1.1 B-Tree 索引 大多数MySQL存储引擎默认使用的是B+树的索引,不同的存储引擎用不同的方式使用B+树索引,MyISAM使用前缀压缩技术使得索引更小,但是InnoDB则按照元数据格式进行存储:MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行. B树 和 B+ 树 B树: B+树: 区别: B树的关键字和记录是放在一起的,叶子节点可以看作外部节点,不包含任何信息:B+树的非叶子节点中只有关键字和指向下一个节点的索引
-
详解GaussDB for MySQL性能优化
背景 我们先来看看MySQL 8.0的事务提交的大致流程 以上流程,是MySQL8.0对WAL原则的一种实现,这个流程意味着,任何一个事务的提交,一定要完成write buffer和flush to disk流程. 然而那么这个流程中,有一个问题:每个服务器的CPU是有限的,服务器能处理的Thread也是有上限的,那么当我们的业务的并发数量,远远大于我们服务器能并行处理的数量时,那么后来的事务,只能等待前面的事务提交后才能被处理.在这之前,他们什么也做不了.因此,在大并发场景下,如何进一步提升线
-
详解Hibernate缓存与性能优化
缓存概念 缓存 介于应用程序和永久性数据源(文件,数据库等)之间,作用就是降低应用程序直接读取数据源的频率,从而提高应用程序的运行性能.缓存中的数据就是数据源中数据的复制,应用程序在运行时直接读取缓存中的数据. 缓存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或磁盘,应用程序读写内存的速度显然比读写硬盘的速度快.如果缓存存放的数据非常大,也会用硬盘作为缓存的物理介质. Hibernate缓存分类 在hibernate中提供了二种缓存机制:一级缓存.二级缓存,因为二级缓存策略是针对
-
详解GaussDB(DWS) explain分布式执行计划的示例
摘要:本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点.前言 执行计划(又称解释计划)是数据库执行SQL语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等.如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划.本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点. 1.执行算子介绍 要读懂执行计划,首先要知道数据库执行算子的概念: 下面重点介绍下基于sharing n
-
Android Bitmap详解及Bitmap的内存优化
Android Bitmap详解及Bitmap的内存优化 一.Bitmap: Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件. 常用方法: public void recycle() // 回收位图占用的内存空间,把位图标记为Dead public final boolean isRecycled() //判断位图内存是否已释放 public final int getWidth() //获取位图的
-
详解Jackson 使用以及性能介绍
直接上代码,看下最简单也是最常用的方法,将Object 转为 JSON 以及将Json转为Object方式 public class TestJackson { public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); Map<String,Object> params = new HashMap<>(); params.pu
-
MySQL性能优化的一些技巧帮助你的数据库
你完成了你的品牌新的应用程序,一切工作就像一个魅力.用户来使用你的网络.每个人是幸福的. 然后,突然间,一个大爆发的用户杀死你的MySQL服务器,您的网站已关闭.出了什么问题?你怎么能阻止它吗? 以下是MySQL性能优化的一些技巧,将帮助你,帮助你的数据库. 大处着眼 在早期的发展阶段,你应该知道预期到您的应用程序的用户数.如果你希望很多用户来说,你应该想想大,从一开始,计划进行复制,可扩展性和性能. 但是,如果你优化你的SQL代码,架构和索引策略,也许你不会需要大环境.你必须总是三思而后行的性
-
php导入大量数据到mysql性能优化技巧
本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时分析与优化,需要的朋友可以参考一下. 之前有几篇文章,说了最近tiandi在帮朋友做一个小项目,用于统计电话号码的,每次按需求从数据库里随机生成打包的电话号码,然后不停地让人打这些电话号码推销产品(小小鄙视一下这样的行为).但是朋友要求帮忙,咱也不能不帮啊,是吧.程序两个星期前已经做好,测试完毕交工
-
Mysql性能优化方案分享
网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句: mysql> show variables; 一.慢查询
-
Mysql性能优化案例研究-覆盖索引和SQL_NO_CACHE
场景 产品中有一张图片表pics,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化 表结构很简单,主要字段: 复制代码 代码如下: user_id 用户ID picname 图片名称 smallimg 小图名称 一个用户会有多条图片记录,现在有一个根据user_id建立的索引:uid,查询语句也很简单:取得某用户的图片集合: 复制代码 代码如下: select picname, smallimg from pics where user_id = xxx; 优化
-
19个MySQL性能优化要点解析
以下就是跟大家分享的19个MySQL性能优化主要要点,一起学习学习. 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的.因为,我们某些查询语句会让MySQL不使用缓存.请看下面的示例: // 查询缓存不开启 $r = mysq
随机推荐
- javascript 循环调用示例介绍
- div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
- jQuery Mobile开发中日期插件Mobiscroll使用说明
- python 解析html之BeautifulSoup
- Ubuntu 下 vim 搭建python 环境 配置
- php获取后台Job管理的实现代码
- PHP中把对象数组转换成普通数组的方法
- php从数据库查询结果生成树形列表的方法
- Windows中使用计划任务自动执行PHP程序实例
- python WindowsError的错误代码详解
- Python使用PyGreSQL操作PostgreSQL数据库教程
- Python调用C语言开发的共享库方法实例
- C++设计模式编程中proxy代理模式的使用实例
- AJAX跳转路径代码
- javascript 拽拉效果 供JS初学者学习参考
- iPhone手机上搭建nodejs服务器步骤方法
- 当恢复sqlserver bak文件时,原始的用户无法删除的解决方法
- MSSQL 数据库备份和还原的几种方法 图文教程
- Jquery动态添加输入框的方法
- JQuery打造省市下拉框联动效果