InnoDB 之 BufferPool 详解

BufferPool官方文档: MySQL :: MySQL 8.0 Reference Manual :: 15.5.1 Buffer Pool 在InnoDB存储引擎中,为了提高MySQL服务性能,减少磁盘IO次数,故此所有的DML操作均是在内存中的 BufferPool 中完成。最后通过服务的异步刷盘策略把修改数据落盘到磁盘中。 为什么需要设计 BufferPool ?这里我想一般有计算机基础知识的人都知道,内存和硬盘的效率是天差地别的,对于CPU来说硬盘的传输以及响应时间性能太低下,故此 MySQL 设计出了 BufferPool 来映射磁盘中的真实数据,并在内存中进行数据的管理与操作,这样执行DML语句的效率不就起飞了吗?至于是如何保障内存中的 BufferPool 数据在宕机,掉电的场景不会出现丢失(物理打击除外😃,大力出奇迹,硬盘都给你扬了),之前我的文章中也有所讲解: MySQL 执行链路当客户端SQL语句提交给 MySQL 服务器时首先需要建立连接,连接器会与客户端进行连接,并校验用户身份信息,权限信息,如果权限通过,则通过SQL分析器对SQL语句进行语义分
17 min read

MySQL 执行链路

当客户端SQL语句提交给 MySQL 服务器时首先需要建立连接,连接器会与客户端进行连接,并校验用户身份信息,权限信息,如果权限通过,则通过SQL分析器对SQL语句进行语义分析(检查SQL语句是否合法,能否解析通过),分析完成后将会对SQL的执行过程进行优化,例如剔除不必要的查询条件 1=1 ,以及选择最优的索引与Where条件的字段排序。 然后交给执行器执行此SQL语句,执行器将会根据数据库所使用的存储引擎执行SQL。MySQL在设计时是分为了两层,即Server层和存储引擎层。这样做的好处就是解藕,可以根据不同的数据库去选择合适的存储引擎。 常用的InnoDB存储引擎是以页(16KB)为单位来管理存储空间的,任何的增删改差操作最终都会操作完整的一个页,会将整个页加载到 BufferPool 中并且所有的数据操作都是在 BufferPool 中完成,BufferPool 通常设置为服务器60%-70%左右的内存占用,这样数据的操作直接在内存中执行,从而提高数据操作的效率(如果每一条DML语句都要进行 IO 操作那么数据库的磁盘很容易变成瓶颈,改一条数据需要先从磁盘中读取,然后刷盘
11 min read

分布式事务之 Seata

在企业应用程序开发中,我们生产环境会不止一台存储节点,特别是在微服务领域中,我们会设计每个业务Service模块都会对应一个自身业务模块的DB存储节点。然后再对这个DB存储节点做高可用部署,如主从同步,半同步,异步复制+主从切换这些方案,并且后续当数据库数据体积越来越庞大时,便要继续对存储节点做垂直或水平拆分。 那么我们在编写Service中的业务逻辑时,肯定会遇到一个业务操作会调用到其他不同的业务模块,那么对应的产生数据就会落盘到不同的存储节点中,为了保障多个数据库实例之间的事物ACID特性,故此我们肯定需要通过一些手段来保障两个不同的数据库存储节点对这个业务开启的事物作出相同的操作,达到以下效果: 1、如果整个业务调用链路均成功,那么所有对应的数据库做事物提交。 2、如果调用链路中抛出了异常,那么所有对应的数据库做回滚操作。 为了到达这个目的,故此出现了Seata: 在这些分布式事务解决方案中,一般有以下这些角色: RM (Resource Manager) 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 TC (Tr
8 min read

HBase介绍以及对比MongoDB

HBase全称:Hadoop Database。 HBase是一种高可靠性,高性能,面向列的可扩展分布式存储系统,使用HBase技术在廉价的PC服务器上构建大规模结构化存储集群。 HBase的目标是存储和处理大量数据,特别是仅使用标准硬件配置即可处理包含数千行和列的大量数据,可处理PB级别数据存储,亿级QPS查询。 它适用于实时性要求不高的业务场景,HBase存储Byte数组,该数组不介意数据类型,从而允许动态,灵活的数据模型。 架构解析: HBase由HMaster和HRegionServer组成,并且遵循主从服务器体系结构。 HBase将逻辑表分为多个数据块HRegion,并将它们存储在HRegionServer中。 HMaster负责管理所有HRegionServer。 它本身不存储任何数据,而仅存储数据到HRegionServer的映射(元数据)。 群集中的所有节点均由Zookeeper协调,并处理HBase操作期间可能遇到的各种问题。 HBase的基本架构如下所示: 客户端:使用HBase的RPC机制与HMaster和HRegionServer通信,提交请求并获得
13 min read

MySQL 事物死锁解析

在使用mysql数据库中,随着我们业务与功能模块的增加、数据库的事物数量会随之上升。在开发业务功能的场景中我们会经常开启事物操作数据,或者开启分布式全局事物操作数据时、事物过多,在并发进行的场景中往往会有几率产生事物死锁问题。 那么我们来分析一下事物死锁产生的原因: 两个 session 连接:一个session持有T1事物,另外一个session持有T2事物。 1.T1事物修改rows1 2.T2事物修改rows2 3.T2事物修改rows1 4.T2等待T1释放rows1的x锁 5.T1事物修改Rows2 6.T1等待T2释放rows2的x锁 7.相互等待死锁 死锁在没有外力的干扰下,程序本身无力解决此问题。 必须借助人为或者另外的守护线程来解决此死锁问题。 解决死锁的方法也很简单:释放其中一个事物,让其回滚即可。 但回滚有一个问题,回滚哪个事物更合理,mysql采用的是根据undo log 中谁的条数更多,谁的权重越大,则舍弃权重更小的事物进行回滚,可以更好解决事物死锁。让其回滚的数据量尽量减少,以减少服务的性能牺牲。 系统中任何一个事务发生死锁的概率
3 min read

MySQL 百万级数据导出excel文档

公司系统需要给用户提供列表数据导出 excel 文档的功能。 但有的公司的列表数据如财务流水已经高达百万级别,对于这样的数据导出,我们需要提出一个解决方案。不然在月底几百家公司进行导出excel,将会导致mysql QPS急剧上升,服务器cpu,ram,瞬间到达报警阀门。严重大批量导出可能会导致服务器不可用,或面临宕机问题(对于财务等敏感数据,需要做文件加密或者临时文件授权下载操作)。 最终我的方案是部署一个数据库从库 ,再单独部署一个服务器或集群服务器跑上Springboot项目作为MQ的消费者集群,所有的导出请求均落盘至MQ队列中,Springboot会采用拉模式主动拉取MQ队列中的导出Excel导出消息进行执行,合理的使用了MQ的削峰以及异步功能。 消费者这边通过分页分批量查询mysql列表数据,使用ali easy excel api进行硬盘输出,完成输出后上传oss,删除本地硬盘文件。 这样的设计让导出功能模块完全脱离主业务,导出功能直接为一个新的功能模块,部署服务器也分单独的节点。这样就算导出项目因为大量突如其来的导出请求,导致宕机(一般也不会MQ可以很好的避免此问
3 min read

MySQL 千万级数据分页

随着公司业务增大,数据量也是随之剧增。MySQL作为一款社区免费开源数据库。想要用它做几百万的数据分页。光靠limit是不靠谱的。当然不是诋毁mysql,mysql作为开源插拔式存储引擎数据库,已经是可以满足绝大部分的应用场景需求。使用mysql管理1000tb也不是问题。但是使用方式却是一个问题。 limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。 limit在偏移量小于10w时性能还勉强可以接受,但随着偏移量越来越大,性能急剧下降。 公司单表账务数据已经到达230w ,做分页limt  来查询最后一页的数据,怕是没有个20秒是查询不出来的。当然具体的时间也要根据是否有索引,字段数量,数据内容而定,查询条件而定。 为了解决分页效率问题,我采用方案是: select id from table limit 100000,20 (带上where条件作为子查询) 由于主键id原本就是主键索引,所以limit的速度效率很高。并把条件字段加入复合索引,效率才会有质量的提升 。
3 min read

随心笔记

hi 欢迎留言,共同探讨IT技术~