备案 控制台
开发者社区 数据库 文章 正文

8个 数据库性能优化方案,你知道几个?(建议收藏) 上

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
推荐场景:
PolarDB for MySQL 多主集群体验
简介: 8个 数据库性能优化方案,你知道几个?(建议收藏) 上

毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论,能让大家快速、准确的去选择出合适的优化方案,我相信能够快速准备解决咱么日常遇到的80%甚至90%的性能问题。

从解决问题的角度出发,我们得先了解到问题的原因;其次我们得有一套思考、判断问题的流程方式,让我们合理的站在哪个层面选择方案;最后从众多的方案里面选择一个适合的方案进行解决问题,找到一个合适的方案的前提是我们自己对各种方案之间的优缺点、场景有足够的了解,没有一个方案是完全可以通吃通用的,软件工程没有银弹。

下文是我工作多年以来,曾经使用过的八大方案,结合了平常自己学习收集的一些资料,以系统、全面的方式整理成了这篇博文,也希望能让一些有需要的同行在工作上、成长上提供一定的帮助。

为什么数据库会慢?

 

无论是关系型数据库还是 NoSQL,任何存储系统决定于其查询性能的主要有三种:

查找的时间复杂度

数据总量

高负载

而决定于查找时间复杂度主要有两个因素:

查找算法

存储数据结构

无论是哪种存储,数据量越少,自然查询性能就越高,随着数据量增多,资源的消耗(CPU、磁盘读写繁忙)、耗时也会越来越高。

从关系型数据库角度出发,索引结构基本固定是B+Tree,时间复杂度是O(log n),存储结构是行式存储。因此咱们对于关系数据库能优化的一般只有数据量。

而高负载造成原因有高并发请求、复杂查询等,导致CPU、磁盘繁忙等,而服务器资源不足则会导致慢查询等问题。

该类型问题一般会选择集群、数据冗余的方式分担压力。

应该站在哪个层面思考优化?

 

从上图可见,自顶向下的一共有四层,分别是硬件、存储系统、存储结构、具体实现。

层与层之间是紧密联系的,每一层的上层是该层的载体;因此越往顶层越能决定性能的上限,同时优化的成本也相对会比较高,性价比也随之越低。

以最底层的具体实现为例,那么索引的优化的成本应该是最小的,可以说加了索引后无论是 CPU 消耗还是响应时间都是立竿见影降低。

然而一个简单的语句,无论如何优化加索引也是有局限的,当在具体实现这层没有任何优化空间的时候就得往上一层【存储结构】思考,思考是否从物理表设计的层面出发优化(如分库分表、压缩数据量等),如果是文档型数据库得思考下文档聚合的结果。

如果在存储结构这层优化得没效果,得继续往再上一次进行考虑,是否关系型数据库应该不适合用在现在得业务场景?

如果要换存储,那么得换什么样的 NoSQL?

所以咱们优化的思路,出于性价比的优先考虑具体实现,实在没有优化空间了再往上一层考虑。当然如果公司有钱,直接使用钞能力,绕过了前面三层,这也是一种便捷的应急处理方式。

该篇文章不讨论顶与底的两个层面的优化,主要从存储结构、存储系统中间两层的角度出发进行探讨。

八大方案总结

 

数据库的优化方案核心本质有三种:减少数据量、用空间换性能、选择合适的存储系统。

这也对应了开篇讲解的慢的三个原因:数据总量、高负载、查找的时间复杂度。

这里大概解释下收益类型:短期收益,处理成本低,能紧急应对,久了则会有技术债务;长期收益则跟短期收益相反,短期内处理成本高,但是效果能长久使用,扩展性会更好。

静态数据意思是,相对改动频率比较低的,也无需过多联表的,where 过滤比较少。动态数据与之相反,更新频率高,通过动态条件筛选过滤。

减少数据量

减少数据量类型共有四种方案:数据序列化存储、数据归档、中间表生成、分库分表。

就如上面所说的,无论是哪种存储,数据量越少,自然查询性能就越高,随着数据量增多,资源的消耗(CPU、磁盘读写繁忙)、耗时也会越来越高。

目前市面上的 NoSQL 基本上都支持分片存储,所以其天然分布式写的能力从数据量上能得到非常的解决方案。

而关系型数据库,查找算法与存储结构是可以优化的空间比较少,因此咱们一般思考出发点只有从如何减少数据量的这个角度进行选择优化,因此本类型的优化方案主要针对关系型数据库进行处理。

数据归档

 

注意点:别一次性迁移数量过多,建议低频率多次限量迁移。像MySQL由于删除数据后是不会释放空间的,可以执行命令OPTIMIZE TABLE释放存储空间,但是会锁表,如果存储空间还满足,可以不执行。

建议优先考虑该方案,主要通过数据库作业把非热点数据迁移到历史表,如果需要查历史数据,可新增业务入口路由到对应的历史表(库)。

在数据库以序列化存储的方式,对于一些不需要结构化存储的业务来说是一种很好减少数据量的方式,特别是对于一些M*N的数据量的业务场景,如果以M作为主表优化,那么就可以把数据量维持最多是M的量级。

另外像订单的地址信息,这种业务一般是不需要根据里面的字段检索出来,也比较适合。

这种方案我认为属于一种临时性的优化方案,无论是从序列化后丢失了部份字段的查询能力,还是这方案的可优化性都是有限的。

中间表(结果表)

 

中间表(结果表)其实就是利用调度任务把复杂查询的结果跑出来存储到一张额外的物理表,因为这张物理表存放的是通过跑批汇总后的数据,因此可以理解成根据原有的业务进行了高度的数据压缩。

以报表为例,如果一个月的源数据有数十万,我们通过调度任务以月的维度生成,那么等于把原有的数据压缩了几十万分之一。

接下来的季报和年报可以根据月报 *N 来进行统计,以这种方式处理的数据,就算三年、五年甚至十年数据量都可以在接受范围之内,而且可以精确计算得到。

那么数据的压缩比率是否越低越好?

下面有一段口诀:

字段越多,粒度越细,灵活性越高,可以以中间表进行不同业务联表处理。

字段越少,粒度越粗,灵活性越低,一般作为结果表查询出来。

数据序列化存储

 

分库分表

分库分表作为数据库优化的一种非常经典的优化方案,特别是在以前 NoSQL 还不是很成熟的年代,这个方案就如救命草一般的存在。

如今也有不少同行也会选择这种优化方式,但是从我角度来看,分库分表是一种优化成本很大的方案。这里我有几个建议:

分库分表是实在没有办法的办法,应放到最后选择。

优先选择 NoSQL 代替,因为 NoSQL 诞生基本上为了扩展性与高性能。

究竟分库还是分表?量大则分表,并发高则分库

不考虑扩容,一部做到位。因为技术更新太快了,每 3-5 年一大变。

拆分方式

 

只要涉及到这个拆,那么无论是微服务也好,分库分表也好,拆分的方式主要分两种:垂直拆分、水平拆分。

垂直拆分更多是从业务角度进行拆分,主要是为了降低业务耦合度;此外以 SQL Server 为例,一页是 8KB 存储,如果在一张表里字段越多,一行数据自然占的空间就越大,那么一页数据所存储的行数就自然越少,那么每次查询所需要 IO 则越高因此性能自然也越慢;因此反之,减少字段也能很好提高性能。

之前我听说某些同行的表有 80 个字段,几百万的数据就开始慢了。

水平拆分更多是从技术角度进行拆分,拆分后每张表的结构是一模一样的,简而言之就是把原有一张表的数据,通过技术手段进行分片到多张表存储,从根本上解决了数据量的问题。

路由方式

 

进行水平拆分后,根据分区键(sharding key)原来应该在同一张表的数据拆解写到不同的物理表里,那么查询也得根据分区键进行定位到对应的物理表从而把数据给查询出来。

路由方式一般有三种:区间范围、Hash、分片映射表。每种路由方式都有自己的优点和缺点,可以根据对应的业务场景进行选择。

区间范围根据某个元素的区间的进行拆分,以时间为例子,假如有个业务我们希望以月为单位拆分那么表就会拆分像 table_2022-04,这种对于文档型、ElasticSearch 这类型的 NoSQL 也适用,无论是定位查询,还是日后清理维护都是非常的方便的。那么缺点也明显,会因为业务独特性导致数据不平均,甚至不同区间范围之间的数据量差异很大。

Hash 也是一种常用的路由方式,根据 Hash 算法取模以数据量均匀分别存储在物理表里,缺点是对于带分区键的查询依赖特别强,如果不带分区键就无法定位到具体的物理表导致相关所有表都查询一次,而且在分库的情况下对于 Join、聚合计算、分页等一些 RDBMS 的特性功能还无法使用。

一般分区键就一个,假如有时候业务场景得用不是分区键的字段进行查询,那么难道就必须得全部扫描一遍?

其实可以使用分片映射表的方式。

简单来说就是额外有一张表记录额外字段与分区键的映射关系。

举个例子,有张订单表,原本是以 UserID 作为分区键拆分的,现在希望用 OrderID 进行查询,那么得有额外得一张物理表记录了 OrderID 与 UserID 的映射关系。因此得先查询一次映射表拿到分区键,再根据分区键的值路由到对应的物理表查询出来。

可能有些朋友会问,那这映射表是否多一个映射关系就多一张表,还是多个映射关系在同一张表?

我优先建议单独处理,如果说映射表字段过多,那跟不进行水平拆分时的状态其实就是一致的,这又跑回去的老问题。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
唐城子
目录
相关文章
海拥
|
1月前
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
海拥
231 0
阿里云瑶池数据库SelectDB
|
8天前
|
存储 SQL BI
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
阿里云瑶池数据库SelectDB
1018 1
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
倪虹升
|
1月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(上)
后端接口性能优化分析-数据库优化
倪虹升
126 0
技术蜜糖罐
|
1月前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
技术蜜糖罐
45 0
快捷资讯
|
7天前
|
canal 缓存 关系型数据库
高并发场景下,6种方案,保证缓存和数据库的最终一致性!
在解决缓存一致性的过程中,有多种途径可以保证缓存的最终一致性,应该根据场景来设计合适的方案,读多写少的场景下,可以选择采用“Cache-Aside结合消费数据库日志做补偿”的方案,写多的场景下,可以选择采用“Write-Through结合分布式锁”的方案,写多的极端场景下,可以选择采用“Write-Behind”的方案。
快捷资讯
40 0
兀码
|
9天前
|
存储 缓存 分布式数据库
数据库性能优化方向的三大类别
【6月更文挑战第6天】本文介绍了数据库优化策略,包括集中式数据库的反规范化设计(如增加冗余列、派生列、重组合表、水平和垂直分表)和数据一致性保障;这些方法旨在提升性能、确保数据安全和适应大规模数据场景。
兀码
31 1
数据库性能优化方向的三大类别
进朱者赤
|
9天前
|
存储 SQL 缓存
Java性能优化(十)-数据库调优-数据库参数设置优化
Java性能优化(十)-数据库调优-数据库参数设置优化
进朱者赤
11 0
兀码
|
12天前
|
数据库 关系型数据库 索引
通过实例理解数据库性能优化的方向
【6月更文挑战第3天】性能优化是提升用户体验的关键,尤其是对数据库的优化。慢速数据库可能导致页面加载延迟,造成用户流失。通过组合优化,可确保数据库高效运行,支持应用程序顺畅,提供无缝用户体验。
兀码
19 0
通过实例理解数据库性能优化的方向
拥抱大数据
|
19天前
|
缓存 NoSQL 数据库
记录线上数据库飙升到60%的性能优化
有一天,dba在数据库告警群找到我,说我们数据库CPU有规律性的尖刺,qps每次突然增加500+,尖刺时cpu飙升到60%,没尖刺时只有5%左右
拥抱大数据
286 6
记录线上数据库飙升到60%的性能优化
申公豹
|
23天前
|
SQL 关系型数据库 数据库
阿里云数据库 RDS SQL Server版实战【性能优化实践、优点探析】
本文探讨了Amazon RDS SQL Server版在云数据库中的优势,包括高可用性、可扩展性、管理便捷、安全性和成本效益。通过多可用区部署和自动备份,RDS确保数据安全和持久性,并支持自动扩展以适应流量波动。可视化管理界面简化了监控和操作,而数据加密和访问控制等功能保障了安全性。此外,弹性计费模式降低了运维成本。实战应用显示,RDS SQL Server版能有效助力企业在促销高峰期稳定系统并保障数据安全。阿里云的RDS SQL Server版还提供了弹性伸缩、自动备份恢复、安全性和高可用性功能,进一步优化性能和成本控制,并与AWS生态系统无缝集成,支持多种开发语言和框架。
申公豹
169 2

热门文章

最新文章

  • 1
    使用TDengine国产时序数据库存储能耗数据并通过钉钉机器人接收报警信息
  • 2
    mysql 数据库中出现no database selected
  • 3
    第100篇博文纪念 | C# 根据数据库表结构生成DOC数据库文档(3)
  • 4
    【Oracle Database 12c新特性】 In-Database Archiving数据库内归档
  • 5
    在 CCR 环境中使用 Exchange 命令行管理程序移动存储组和数据库
  • 6
    突发事件防止数据库被打死紧急处理措施
  • 7
    Android ORMLite数据库简介
  • 8
    操作系统存储管理和oracle数据库(第三篇)
  • 9
    一条sql语句“导致”的数据库宕机问题及分析
  • 10
    自定义t4模版,根据数据库生成实体模型
  • 1
    在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
    74
  • 2
    阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
    410
  • 3
    云效常见问题之页面提示数据库保存不进去如何解决
    27
  • 4
    视图、触发器和存储过程:提升数据库功能
    31
  • 5
    阿里云数据库 SelectDB 内核 Apache Doris 2.0.6 版本正式发布
    919
  • 6
    阿里云数据库 SelectDB 内核 Apache Doris 如何基于自增列满足高效字典编码等典型场景需求|Deep Dive 系列
    306
  • 7
    【Shell 命令集合 网络通讯 】Linux 更新邮件别名数据库 newaliases命令 使用指南
    31
  • 8
    java面向对象高级分层实例_数据库操作类
    13
  • 9
    数据库的实现【笔记】
    16
  • 10
    数据库设计【笔记】
    14
  • 相关课程

    更多
  • 数据库的前世今生
  • 数据库核心概念
  • 从传统数据库到云数据库演进
  • 数据库常见问题排查
  • 数据库及SQL/MySQL基础
  • 高校精品课-西安交通大学 -数据库理论与技术
  • 相关电子书

    更多
  • 2022 DTCC-阿里云一站式数据库上云最佳实践
  • 云时代的数据库技术趋势
  • 超大型金融机构国产数据库全面迁移成功实践
  • 相关实验场景

    更多
  • PolarDB for AI:在数据库中通过SQL实现AI能力
  • 云原生HTAP数据库,让你的交易和分析一库搞定
  • Excel文件转存到RDS数据库
  • PolarDB for PostgreSQL 闪回特性体验
  • 快速体验PolarDB开源数据库
  • SQLServer数据库的创建
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司海西优秀网站设计公司大庆企业网站制作杭州网站排名优化多少钱大同SEO按效果付费多少钱舟山外贸网站设计报价南山网站推广系统哪家好果洛网站优化按天计费报价东莞百度seo价格南澳网站推广系统哪家好崇左网站建设大芬seo排名价格衡水百度爱采购公司丽江seo排名报价延边网站排名优化推荐文山seo排名公司亳州seo价格赣州网站开发公司池州阿里店铺运营哪家好常州百度网站优化报价咸阳优化公司张家界SEO按天收费平湖关键词按天收费多少钱绍兴关键词排名多少钱巴中网站关键词优化普洱网站推广系统报价随州网站优化软件价格西乡百度标王报价昆明网站排名优化公司绵阳网站优化按天扣费价格贵港百搜标王多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化