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

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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
唐城子
目录
相关文章
海拥
|
8天前
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
海拥
183 0
终有救赎
|
8天前
|
中间件 关系型数据库 Java
MySQL数据库分库分表方案
MySQL数据库分库分表方案
终有救赎
162 0
MySQL数据库分库分表方案
倪虹升
|
8天前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(上)
后端接口性能优化分析-数据库优化
倪虹升
118 0
技术蜜糖罐
|
8天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
技术蜜糖罐
39 0
倪虹升
|
8天前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(下)
后端接口性能优化分析-数据库优化
倪虹升
79 1
1941623231718325
|
8天前
|
缓存 关系型数据库 MySQL
MySQL数据库性能优化实战
【4月更文挑战第30天】本文探讨了MySQL性能优化实战技巧,包括硬件与配置优化(如使用SSD、增加内存和调整配置参数)、索引优化(创建合适索引、使用复合索引及定期维护)、查询优化(避免全表扫描、减少JOIN和使用LIMIT)、分区与分片(表分区和数据库分片),以及使用缓存、定期清理数据库和监控诊断。通过这些方法,可以提升数据库性能和响应速度。
1941623231718325
50 0
达芬奇要当程序员
|
8天前
|
存储 缓存 负载均衡
数据库性能优化(查询优化、索引优化、负载均衡、硬件升级等方面)
数据库性能优化(查询优化、索引优化、负载均衡、硬件升级等方面)
达芬奇要当程序员
74 1
达芬奇要当程序员
|
8天前
|
存储 SQL NoSQL
关系数据库与非关系数据库:选择适当的数据存储方案
关系数据库与非关系数据库:选择适当的数据存储方案
达芬奇要当程序员
67 2
红目香薰
|
8天前
|
监控 关系型数据库 MySQL
MySQL技能完整学习列表12、性能优化——1、性能指标和监控——2、优化查询和数据库结构——3、硬件和配置优化
MySQL技能完整学习列表12、性能优化——1、性能指标和监控——2、优化查询和数据库结构——3、硬件和配置优化
红目香薰
160 0
倪虹升
|
8天前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(中)
后端接口性能优化分析-数据库优化
倪虹升
124 0

热门文章

最新文章

  • 1
    Python与NoSQL数据库(MongoDB、Redis等)面试问答
  • 2
    手把手教你实现 OceanBase 数据到阿里云数据库 SelectDB 内核版 Apache Doris 的便捷迁移|实用指南
  • 3
    Druid数据库连接池简介及应用推广(老项目翻出来做下记录)
  • 4
    Centos7安装mariadb数据库
  • 5
    MySQL环境搭建——“MySQL数据库”
  • 6
    数据库库表结构设计:原理、实例与最佳实践
  • 7
    关系型数据库ALTER语句
  • 8
    寻找最懂数据库的你,开启云端推广事业!丰厚收益,轻松赚取!
  • 9
    MySQL数据库优化技巧:提升性能的关键策略
  • 10
    Python与MySQL数据库交互:面试实战
  • 1
    sql数据库查询语句大全
    28
  • 2
    面对多种国产数据库,如何选择合适的技术栈和发展方向
    49
  • 3
    宝塔数据库崩溃解决方案详解
    61
  • 4
    视觉智能平台常见问题之创建人脸数据库失败如何解决
    31
  • 5
    TiDB的优势:为何选择TiDB作为您的数据库解决方案
    165
  • 6
    阿里云数据库使用方法,从购买、创建数据库账号密码到连接数据库全流程
    425
  • 7
    【mysql】—— 数据库的操作
    57
  • 8
    悦数图数据库推出 AI 知识图谱构建器及图语言生成助手
    64
  • 9
    Windows公网远程连接MongoDB数据库【无公网IP】
    79
  • 10
    嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
    642
  • 相关课程

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

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

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

    PHP网站源码石家庄阿里店铺运营价格漳州推广网站多少钱玉溪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次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化