(转)数据库性能分析、优化入门

简介: 原文:http://www.javaeye.com/topic/811222    最近参加了公司一位DBA关于数据库性能的分析,觉得讲得挺不错的,因此做下总结,也算是一种积累。   这个博文整体结构分为三个部分: 第一部分,阐述数据库的数据存储结构; 第二部分,SQL性能分析(核心部分); 第三部分,SQL调优实例。

原文:http://www.javaeye.com/topic/811222

 

 最近参加了公司一位DBA关于数据库性能的分析,觉得讲得挺不错的,因此做下总结,也算是一种积累。

 

这个博文整体结构分为三个部分:

第一部分,阐述数据库的数据存储结构;

第二部分,SQL性能分析(核心部分);

第三部分,SQL调优实例。 

 

1 数据库的数据存储结构
在开始性能优化前,首先需要对优化的对象进行了解,这样我们才能抓住问题的本质。

 

页面(BLOCK)
数据库中最小的分配,读取单元,一般来说,设置为8K大小。

 
数据库中的表,是由一些列的页面(block)组成
页面物理上可以不连续,但是逻辑上是连续的

 索引
索引也是由页面(block)组成
通常采用B+树的组织形式

 

 

2 SQL性能分析(核心部分)

重中之重:一条sql是否ok?如何优化?走索引是否可以提高性能?全在于下面一句话:
此SQL需要访问多少页面(BLOCK)!!!

为什么是这样的呢?原因是读页面是大量的IO操作,需要在内存中定位,或是外存中定位并加载,开销很大。而其他的SQL比较操作,>,=,like…,都是CPU计算,相对开销较小。

 

下面分别对几类常见SQL访问需要读取的页面(BLOCK)进行分析:

表全扫描
表中所有的页面(BLOCK)
索引全扫描
索引中所有的页面。优势:索引项相对于表项较小,页面更少
索引范围扫描
索引层数+范围中的BLOCK
索引唯一扫描
索引层数。优势:最小的页面访问量
索引扫描+回表扫描
索引BLOCK+表BLOCK

 

丛上面的分析可知,索引唯一扫描是最快的,也就是我们平常从某张表中根据唯一的ID查询一个唯一记录的SQL;表全扫描是最慢的,也就是需要遍历表中所有的记录。

 

3 SQL调优实例

这里先说一下,不是每个SQL需要优化的,如果SQL性能满足需求,是不需要做优化的。

 出了性能问题的的SQL:

Sql代码 
  1. SELECT *  
  2.   FROM (select rid  
  3.           FROM (select r.rid, rownum rnum  
  4.                   FROM (select rowid rid  
  5.                           FROM CREDIT_REMARK t  
  6.                          WHERE t.POSTER_MEMBER_ID = :1 and t.POSTER_ROLE = #memberRole#  
  7.                          ORDER BY t.GMT_REMARK_MODIFIED DESC, t.ID DESC) r  
  8.                  WHERE rownum <= #endRow :INTEGER#)  
  9.          WHERE rnum > #startRow :INTEGER#) t1,  
  10.        CREDIT_REMARK t2  
  11.  WHERE t1.rid = t2.rowid ORDER BY t2.GMT_REMARK_MODIFIED DESC, t2.ID DESC;  

 

 

解决方案: 

建索引: (POSTER_MEMBER_ID, POSTER_ROLE,STATUS, GMT_REMARK_MODIFIED DESC, ID DESC), 从普通表中完成分页转为索引内完成分页,减少回表需要读取的页面。
相关文章
|
7天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
39 3
|
3月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
133 1
|
7天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
50 6
|
7天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
50 1
|
7天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
133 4
|
2月前
|
机器学习/深度学习 SQL 运维
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
96 4
|
6月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
7月前
|
关系型数据库 数据库 数据安全/隐私保护
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
|
7月前
|
存储 数据挖掘 数据处理
2600 万表流计算分析如何做到? 时序数据库 TDengine 助力数百家超市智能化转型
在生鲜超市的高效运营中,实时数据分析至关重要。万象云鼎的“云鲜生”通过智能秤+网关+软件系统的组合,实现了销售数据的精准管理与优化。而在数据处理方面,TDengine 的流计算能力成为了这一方案的核心支撑。本文详细分享了“云鲜生”如何利用 TDengine 高效存储和分析海量销售数据,在优化超市运营、提升用户体验的同时,解决高基数分组、高并发查询等技术挑战。
165 1

热门文章

最新文章