数据库性能优化的指标是通过充分利用系统资源来最小化查问的响应工夫。对这些资源的最佳利用包含最大限度地缩小网络流量、磁盘 I/O 和 CPU 工夫。这个指标只能通过了解数据的逻辑和物理构造、零碎上应用的应用程序以及数据库的抵触应用如何影响性能来实现。实际上,数据库性能优化是一项系统工程,须要应用系统化分析方法,从硬件、软件和利用场景等多个相关联的维度深入分析、评估与优化,在数据库系统的架构阶段、设计阶段、开发阶段、部署阶段、运行阶段等各环节中去寻找性能问题的瓶颈和解决方案。
本文精选了 HeapDump 性能社区中的 8 篇数据库性能优化相干文章,这些文章内不仅蕴含了影响数据库性能的因素,数据库性能评估规范、优化办法的内容,还介绍了一些数据库设计准则和编程技巧,并且记录了一些或大或小的实战案例,帮忙大家疾速理解数据库性能优化,把握一些实操技能。
1. 带你重走 TiDB TPS 晋升 1000 倍的性能优化之旅
作者:TiDB_Robot
作者介绍:TiDB 是一个开源的 NewSQL 数据库,反对混合事务和剖析解决(HTAP)工作负载。它与 MySQL 兼容,并且能够提供程度可扩展性、强一致性和高可用性。它次要由 PingCAP 公司开发和反对,并在 Apache 2.0 下受权。TiDB 现已正式入驻 HeapDump 性能社区,将来将会分享更多数据库性能优化相干的优质文章。
文章链接:https://heapdump.cn/article/3021827
精彩导读:性能优化这个事件外围只有一句话,用户响应工夫去哪儿了?性能优化很艰难的起因在于,为了定位用户响应工夫在各个模块的散布,须要对系统的各个部件进行测量和剖析,从底层硬件,CPU、IO、网络到下层利用架构,利用代码跟数据库的交互方式都须要波及。本文第一局部介绍了一下性能优化的通用的办法,第二局部讲了一个理论案例。
用户响应工夫
性能优化的第一个概念是用户响应工夫。用户响应工夫是用户在应用一个业务零碎的时候,发动一个申请,这个申请返回总体耗费的工夫为用户响应工夫。一个典型的用户响应工夫的散布如下图:
从时序图看,一个 用户响应工夫可能包含:
1. 用户申请的达到应用服务器的网络工夫
2. 应用服务器自身业务逻辑解决工夫
3. 应用服务器跟数据库服务器之间交互耗费的网络的工夫
4. 数据库屡次解决 SQL 的工夫
5. 应用服务器返回用户数据的网络工夫
整个链路上来看,会波及到网络、应用服务器和数据库这几个重要的部件。只有晓得户响应工夫在每个模块的散布,咱们就能定位瓶颈,进行针对性的优化。
事实中性能瓶颈的定位又十分难。因为绝大部分的利用都没有去部署 APM 之类的工具,可能去跟踪一个利用申请在全链路下面的工夫耗费。大部分场景的性能优化工作,都是在不足全局的工夫散布状况下进行的。咱们举荐的一种牢靠的性能优化的办法:基于数据库工夫进行性能优化。
数据库工夫
数据库工夫为单位工夫内数据库提供的服务工夫。比照数据库工夫和利用总的用户响应工夫,能够判断利用零碎的瓶颈是否在数据库中。
一个利用零碎,ΔT 工夫内提供的总的服务工夫,能够拿均匀业务的 TPS 乘以均匀的响应工夫。ΔT 工夫内的数据库工夫,有多种算法:
1. 均匀 TPS X 均匀事务提早 X ΔT
2. 均匀的 QPS X 均匀的提早 X ΔT
3. 均匀的沉闷连接数 X ΔT, 下图数据库沉闷连贯图的面积即为数据库工夫
基于数据库工夫和用户响应工夫的比照,先从全局的角度判断瓶颈在数据库外面还是在数据库的里面,而后再进行针对性的排查和优化。把数据库工夫除以总的用户响应工夫:
趋近 0,数据库工夫在总的服务工夫外面是很小的占比,阐明瓶颈并不在数据库中。
趋近 1,阐明整个利用零碎瓶颈是在数据库外面。工程师通过升高数据库工夫来进行性能优化,比方优化 SQL 执行打算、解决数据库中存在的热点争用等。
2.5G 时代,如何彻底搞定海量数据库的设计与实际
作者:孙玄|奈学教育
作者介绍:孙玄,现任奈学教育科技创始人 &CEO,毕业于浙大,前百度资深研发工程师、前 58 团体技术委员会主席/高级零碎架构师到前转转公司技术委员会主席/首席架构师/大中后盾技术负责人。江湖人称“玄姐”,出版过《百万年薪架构师修炼之路》书籍。
文章链接:https://heapdump.cn/article/761671
精彩导读:5G 时代,业务数据越来越丰盛,业务应用 MySQL 数据库作为后盾存储,存储引擎应用 InnoDB,会带来哪些挑战?如何针对公司业务特点及 MySQL 数据库个性,制订若干数据库应用标准供一线 RD 在设计业务时参考局部内容要求强制执行。本文从介绍 MySQL 相干要害基础架构,并结合实际案例介绍表和索引的设计技巧,并对标准中重点内容做具体解读。
小结:
1. 自增主键性能不肯定高,须要结合实际业务场景做剖析;
2. 大多数场景数据类型抉择上尽量应用简略的类型;
3. 索引不是越多越好,太多的索引会导致过大的索引文件;
4. 如果要查问的数据能够在索引文件中找到,存储引擎就不会查找主键索引拜访理论记录。
3.Mysql 的 sql 优化办法
作者:臆想的一只猫
文章链接:https://heapdump.cn/article/2994366
精彩导读:本文总结了一些对 mysql 性能无利的编程技巧。
1、抉择最合适的字段属性
2、尽量把字段设置为 NOT NULL
3、应用连贯 (JOIN) 来代替子查问(Sub-Queries)
4、应用联结 (UNION) 来代替手动创立的长期表
5、事务
6、锁定表
7、应用外键
8、应用索引
9、优化查问语句
4. 一些比拟好的 Redis 性能优化思路总结
作者:刘思宁
文章链接:https://heapdump.cn/article/2871512
精彩导读:在一些网络服务的零碎中,Redis 的性能,可能是比 MySQL 等硬盘数据库的性能更重要的课题。比方微博,把热点微博,最新的用户关系,都存储在 Redis 中,大量的查问击中 Redis,而不走 MySQL。那么,针对 Redis 服务,咱们能做哪些性能优化呢?或者说,应该防止哪些性能节约呢?那么,针对 Redis 服务,咱们能做哪些性能优化呢?或者说,应该防止哪些性能节约呢?
在探讨优化之前,咱们须要晓得,Redis 服务自身就有一些个性,比方单线程运行。除非批改 Redis 的源代码,不然这些个性,就是咱们思考性能优化的基本面。首先,Redis 应用操作系统提供的虚拟内存来存储数据。其次,Redis 反对长久化,能够把数据保留在硬盘上。第三,Redis 是用 key-value 的形式来读写的,而 value 中又能够是很多不同品种的数据;更进一步,一个数据类型的底层还有被存储为不同的构造。最初,在下面的介绍中没有提到的是,Redis 大多数时候是单线程运行的(single-threaded),即同一时间只占用一个 CPU,只能有一个指令在运行,并行读写是不存在的。
针对这些个性,概括了对 Redis 进行性能优化的几个切入点:优化网络延时;警觉执行工夫长的操作;优化数据结构、应用正确的算法;思考操作系统和硬件是否影响性能;思考长久化带来的开销;应用分布式架构 —— 读写拆散、数据分片。
5. 千万级数据表选错索引导致的线上慢查问事变
作者:后端技术漫谈
文章链接:https://heapdump.cn/article/2166752
精彩导读:最近在线上环境遇到了一次 SQL 慢查问引发的数据库故障,影响线上业务。通过排查后,确定起因是「SQL 在执行时,MySQL 优化器抉择了谬误的索引(不应该说是“谬误”,而是抉择了理论执行耗时更长的索引)」。在排查过程中,查阅了许多材料,也学习了下 MySQL 优化器抉择索引的基本准则,在本文中进行解决问题思路的分享。自己 MySQL 理解深度无限,如果谬误欢送感性探讨和斧正。在这次事变中也能充沛看出深刻理解 MySQL 运行原理的重要性,这是遇到问题时是否独立解决问题的要害。
6.MySQL 全面瓦解 21(番外):一次深夜优化亿级数据分页的微妙经验
作者:翁智华
文章链接:https://heapdump.cn/article/2869483
精彩导读:本次事变的状况是线上的一个查问数据的接口被疯狂的失去理智般的调用,这个操作间接导致线上的 MySql 集群被拖慢了。剖析慢查问日志后发现,其实对于咱们的 MySQL 查问语句来说,整体效率还是能够的,该有的联表查问优化都有,该简略的查问内容也有,要害条件字段和排序字段该有的索引也都在,问题在于他一页一页的分页去查问,查到越前面的页数,扫描到的数据越多,也就越慢。这种查问的慢,其实是因为 limit 前面的偏移量太大导致的。比方像下面的 limit 2000000,25,这个等同于数据库要扫描出 2000025 条数据,而后再抛弃后面的 20000000 条数据,返回剩下 25 条数据给用户,这种取法显著不合理。《高性能 MySQL》第六章:查问性能优化,对这个问题有过阐明:分页操作通常会应用 limit 加上偏移量的方法实现,同时再加上适合的 order by 子句。但这会呈现一个常见问题:当偏移量十分大的时候,它会导致 MySQL 扫描大量不须要的行而后再摈弃掉。
7.Redis 高负载下的中断优化
作者:骁雄 春林
作者介绍:骁雄,14 年退出美团点评,次要从事 MySQL、Redis 数据库运维,高可用和相干运维平台建设。春林,17 年退出美团点评,毕业后始终深耕在运维线,从网络工程师到 Oracle DBA 再到 MySQL DBA 多种岗位转变,当初美大主要职责 Redis 运维开发和优化工作。
文章链接:https://heapdump.cn/article/2842148
精彩导读:2017 年年初以来,随着 Redis 产品的用户量越来越大,接入服 务越来越多,再加上美团点评 Memcache 和 Redis 两套缓存交融,Redis 服务端的总体申请量从年初最开始日访问量百亿次级别上涨到顶峰时段的万亿次级别,给运维和架构团队都带来了极大的挑战。本来稳固的环境也因为申请量的上涨带来了很多不稳固的因素,其中始终困扰咱们的就是网卡丢包问题。起初线上存在局部 Redis 节点还在应用千兆网卡的老旧服务器,而缓存服务往往须要承载极高的查问量,并要求毫秒级的响应速度,如此一来千兆网卡很快就呈现了瓶颈。通过整治,咱们将千兆网卡服务器替换为了万兆网卡服务器,本认为能够居安思危,然而没想到,在业务顶峰时段,机器也居然呈现了丢包问题,而此时网卡带宽应用还远远没有达到瓶颈。
8. 记一次慢 SQL 优化
作者:艾小仙
作者介绍:艾小仙,前阿里 P7 技术专家。工作 11 年,做过开发、产品、经营,行业横跨互联网安全、电商、领取、金融、酒店、O2O 等等,热衷于分享大厂面试教训、架构设计、中间件、算法、数据库等热门技术。微信公众号【艾小仙】粉丝数 10w+,曾被各大技术社区公众号转载举荐。
文章链接:https://heapdump.cn/article/3058836
精彩导读:这是一个线上问题,从日志平台查问到的 SQL 执行状况,该 SQL 执行的工夫为 11.146s,能够认定为是一个慢查问。整个状况来看,缓冲区大小、排序字段的数据长度、查问数据条数等都会影响查问性能。剖析了整个排序过程,领导的优化思维就是尽量不应用 using filesort,尤其是在排序的数据量比拟大的时候,那么优化的形式就是尽量让查问进去的数据曾经是排好序的,也就是正当应用联结索引以及笼罩索引。
有性能问题,找 HeapDump 性能社区