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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
8天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
10天前
|
SQL 缓存 监控
数据库性能优化指南
数据库性能优化指南
|
13天前
|
缓存 监控 NoSQL
数据库如何进行性能优化?
【10月更文挑战第31天】数据库如何进行性能优化?
24 3
|
18天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
33 1
|
28天前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
26 1
|
1月前
|
SQL 存储 数据库
慢SQL对数据库写入性能的影响及优化策略
在数据库管理系统中,慢SQL(即执行缓慢的SQL语句)不仅会影响查询性能,还可能对数据库的写入性能产生不利影响
|
3月前
|
开发者 UED Java
Play Framework惊天秘密:如何让异常处理优雅得像芭蕾舞?
【8月更文挑战第31天】在Web应用开发中,异常处理至关重要,直接影响应用稳定性和用户体验。Play Framework作为轻量级Java Web框架,提供了基于Scala偏函数的灵活异常处理机制。通过实现`HttpErrorHandler`接口可定义全局异常逻辑,而在控制器中使用try-catch块则能捕获特定异常。定义自定义异常类也有助于表示特定错误情况。最佳实践包括保持处理一致性、提供有用错误信息、记录日志及分类处理异常。掌握这些技巧,能使Play应用更健壮可靠。
64 1
|
3月前
|
缓存 前端开发 JavaScript
Rails应用慢如蜗牛?揭开数据库到前端的全方位性能优化秘籍,从此告别龟速加载!
【8月更文挑战第31天】本文探讨了Ruby on Rails应用的性能优化方法,涵盖数据库查询与前端渲染。通过具体代码示例,介绍了如何使用`includes`避免N+1查询问题,利用缓存机制提高效率,以及通过合并和压缩CSS及JavaScript文件优化前端渲染。这些技巧有助于全面提升应用性能和用户体验。
49 1
|
3月前
|
存储 算法 Cloud Native
【PolarDB-X列存魔法】揭秘TPC-H测试背后的性能优化秘籍!
【8月更文挑战第25天】阿里巴巴的云原生数据库PolarDB-X以其出色的性能、可靠性和扩展性闻名,在多种业务场景中广泛应用。尤其在列存储模式下,PolarDB-X针对分析型查询进行了优化,显著提升了数据读取效率。本文通过TPC-H基准测试探讨PolarDB-X列存执行计划的优化策略,包括高效数据扫描、专用查询算法以及动态调整执行计划等功能,以满足复杂查询的需求并提高数据分析性能。
92 1
|
3月前
|
开发者 存储 API
Xamarin 开发者的社区资源概览:从官方文档到GitHub示例,全面探索提升开发技能与解决问题的多元化渠道与实用工具
【8月更文挑战第31天】Xamarin 开发者社区资源概览旨在提升开发效率与解决问题,涵盖官方文档、社区论坛、GitHub 项目等。官方文档详尽,涵盖 Xamarin.Forms 使用、性能优化等;社区论坛供交流心得;GitHub 提供示例代码。此外,第三方博客、视频教程及 Xamarin University 等资源也丰富多样,适合各阶段开发者学习与提升。通过综合利用这些资源,开发者可不断进步,应对技术挑战。
48 0