传统关系型数据库性能优化全攻略(上)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 传统关系型数据库性能优化全攻略(上)

影响数据库性能的因素


业务需求层面

  • 不合理的需求
论坛发帖数实时更新
select count(*) from table
  • 深翻页
比如查询第1万页的内容
冷数据加载到内存
热数据被swap出去了
目前基本已没有深翻页需求 只会一页一页往拉下
  • 无用功能堆积
系统臃肿 性能底下
比如登陆网站默认开通账号 仅为了满足KIP需求
其实没有必要 很影响性能
  • 不断升级造成系统复杂性影响整体性能
  • 过度重视用户体验
大量非核心业务消耗了过多的数据库资源
比如图片放在数据库里面


架构层面


数据库中存放的数据是否都合适

  • 不应该二进制音频视屏等富媒体数据存在blob里面
应该存在对象存储里面 比如ceph、fastdfs
  • 超大文件


大表层面 水平拆分

比如一条记录超过100K 一张表是否要超过1000万


是否利用了cache(redis/codis)

  • 访问频繁 更新较少的数据
a、系统配置
b、规则数据
c、活跃用户的基本信息
d、活跃用户个性化定制信息
e、准实时的统计信息


不要使用memory保存频繁但非核心表

数据层的实现是否比较精简

  • 游客留言和相册情况

优化前

image.png


只需要查询广告位表 关系表 广告表即可 
等需要查询广告内容表的时候再去查询
  • 过度追求扩展性 导致对象拆的过度分散

image.png


  • 重复执行相同的sql
在业务逻辑层将数据缓存起来


数据库阶段优化


适度冗余 尽量减少join

image.png


在用户名更新不频繁的情况下 
联表查询变单表查询


大字段垂直拆分 减少io


比如 用户留言是大字段 拆分出来
元信息表:用户编号 用户姓名
用户留言表:用户编号 留言信息


选择合适的数据类型


  • 减少存储空间
  • 联表查询 连接字段使用相同数据类型 否则不会使用索引


是否需要优化query sql


1、执行频率高及消耗资源综合评定是否需要优化
优化高并发低消耗非低并发高消耗 
2、io性能监控工具:iostat;
   cpu性能监控工具:top、vmstat等;
   数据库性能监控工具:profile


定位优化对象的性能瓶颈


1、使用explain执行计划来分析性能瓶颈
2、将线上数据dump到测试环境 再使用explain 保证真实运行环境的真实性
3、从explain 入手 当前执行计划(比如实际用了全表扫描scan即超过了oracle/mysql 30%的数据量 就没有必要用索引了 直接扫描更快)、目标执行计划(希望用index)


优化规则


image.png


用小结果集驱动大结果集 非小表驱动大表


举例

比如一个查询语句需要从2个表联合查询
从表1(共100万数据)查询出50万数据
从表2(共1000万数据)查询出10万数据
则表2 left join 表1
而非表1 left join 表2

原理

联表查询使用Nested Loop的join方式
小结果集可以减少嵌套循环次数


尽可能在索引中完成排序

  • 排序时利用索引的有序性
  • 结果集已经有序 无需排序


不要取出无用的列 特别是Blob 除非必须 不要使用select *

  • 减少网络传输量
  • 排序时可以选择优化的排序算法


仅使用最有效的过滤条件

索引条件不是越多也好


尽量选择满足需求的最小列

使用优先级:
char->int->bigint->float->double->varchar->text->blob


image.png


尽量避免复杂的join和子查询


  • 越复杂的join语句 锁定的资源就越多 锁阻塞的其他线程也越多
  • 能不用子查询就不用
  • 用连接代替子查询
绝大多数子查询都可以用连接解决

联合查询替换子查询 举例说明

  • in

image.png


左连接 left join 原理解释


表A

用户编号 用户名称
1 小孟
2 小凡
3 小霄


表B

用户编号 用户名称
1 小平
2 小凡


表A left join 表B on 用户名称

表A用户编号 表A用户名称 表B用户编号 表B用户名称
1 小孟 1
2 小凡 2 小凡
3 小霄


技巧

1、使用left join 谁在左表谁就是主表即以谁为主
如果以表A为主 则联合之后的数据有3条 
如果以表B为主 则联合之后的数据有2条
2、关联字段是表A的用户名称和表B的用户名称
则相同的则显示 不相同的则为空


重要原则


image.png

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
存储 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:单机性能优化篇
阿里云PolarDB云原生数据库在TPC-C基准测试中,以20.55亿tpmC的成绩打破性能与性价比世界纪录。此外,国产轻量版PolarDB已上线,提供更具性价比的选择。
|
8月前
|
SQL 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.5 应用实践之 TPCH性能优化
PolarDB在复杂查询、大数据量计算与分析场景的测试和优化实践.
251 7
|
3月前
|
SQL Java 应用服务中间件
数据库连接池详解及性能优化趋势
Sharding-JDBC所构建的Database Mesh与Service Mesh相互独立,协同工作。服务间的交互由Service Mesh Sidecar负责管理,而基于SQL的数据库访问则交由Sharding-JDBC-Sidecar处理。业务应用无需关心物理部署细节,实现真正的零侵入。Sharding-JDBC-Sidecar与宿主机生命周期绑定,非静态IP,确保了动态和弹性。尽管如此,数据运维操作仍可通过启动Sharding-JDBC-Server进程作为静态IP入口,借助命令行或UI客户端轻松完成。
|
7月前
|
存储 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:单机性能优化篇
日前,阿里云PolarDB云原生数据库以超越原记录2.5倍的性能一举登顶TPC-C基准测试排行榜,以每分钟20.55亿笔交易(tpmC)和单位成本0.8元人民币(price/tpmC)的成绩刷新TPC-C性能和性价比双榜的世界纪录。 每一个看似简单的数字背后,都蕴含着无数技术人对数据库性能、性价比和稳定性的极致追求,PolarDB的创新步伐从未止步。「阿里云瑶池数据库」公众号特此推出「PolarDB登顶TPC-C技术揭秘」系列硬核文章,为你讲述“双榜第一”背后的故事,敬请关注!
登顶TPC-C|云原生数据库PolarDB技术揭秘:单机性能优化篇
|
11月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
11月前
|
SQL 缓存 监控
数据库性能优化指南
数据库性能优化指南
|
11月前
|
缓存 监控 NoSQL
数据库如何进行性能优化?
【10月更文挑战第31天】数据库如何进行性能优化?
278 3
|
11月前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
169 1
|
12月前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
271 1
|
开发者 存储 API
Xamarin 开发者的社区资源概览:从官方文档到GitHub示例,全面探索提升开发技能与解决问题的多元化渠道与实用工具
【8月更文挑战第31天】Xamarin 开发者社区资源概览旨在提升开发效率与解决问题,涵盖官方文档、社区论坛、GitHub 项目等。官方文档详尽,涵盖 Xamarin.Forms 使用、性能优化等;社区论坛供交流心得;GitHub 提供示例代码。此外,第三方博客、视频教程及 Xamarin University 等资源也丰富多样,适合各阶段开发者学习与提升。通过综合利用这些资源,开发者可不断进步,应对技术挑战。
185 1

热门文章

最新文章