`

数据库优化

 
阅读更多

引自:http://shensy.iteye.com/blog/1664549

前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化。

其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨。

本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库架构或垂直、水平扩展等知识。

(本文中的统计数据库为Mysql)

 

一、SQL调优:

1、提升统计查询性能,首当其冲当然还是对查询SQL进行优化,说到SQL调优,不得不先说一下Mysql里SQL的执行顺序。网上查了一些资料,引用如下:

from -> (on -> join ->) where -> group by -> 聚集函数计算 -> having -> 计算所有表达式 ->  order by -> limit

2、SQL调优的基本思想:

Sql所需处理的资源总量/Sql单位时间所能处理的资源量=Sql执行时间  

(引用自:http://blog.163.com/hs_admin_jsjd/blog/static/175159035201031705956983/)

所以为减少Sql执行时间:

(1)可以增大Sql单位时间所能处理的资源量。

(2)可以减少Sql所需处理的资源总量。

要实现方法(1)一般需要提升硬件处理能力或对RDBMS进行优化。因此我们这里主要讨论方法(2)。即减少Sql所需处理的资源总量,就是减少执行sql所处理的行数。

3、如何减少Sql执行时所处理的行数?

参考了这个人下面的几篇blog,在实际工作中感觉确实比较有帮助,特此记录一下。

http://hideto.iteye.com/blog/218584 SQL性能调优(共3篇)

 

二、关于索引

经过了以上的SQL调优,查询的速度应该已经提升了不少,但是随着库表中的数据日渐增多,简单的SQL调优可能已经无法满足性能的需求,此时可以通过对表添加索引来加快查询速度。本次在优化过程中同样建立了索引和组合索引。下面是一些概念:

1、什么是索引?

索引类似于书的目录,主要用于提高查询效率,也就是按条件查询的时候,先查询索引,再通过索引找到相关的数据,索引相当于记录了对某个关键词,指定到不同的文件,或者文件里的不同位置,当然索引自身也是通过文件来保存的。(本段来源于网络)

2、建立索引。

但是同样不要超出需求创建索引,DBMS在插入、更新或删除行之后必须更新索引。随着表索引的增长,DBMS要花费越来越多的时间维护索引,行的修改速度也会越来越慢。

引用一列的索引称为简单索引,引用多列的索引称为组合索引。列的顺序在组合索引中是重要的。组合索引只作用于定义它的那组列,并非分别作用于每个列或相同列地其他顺序。

以上可以参考我另外一篇blog:http://shensy.iteye.com/blog/1486869 里面记录了一些关于使用索引的知识点。

3、关于索引类型(概念总结来源于网络)。

两种基本的索引结构,也就是索引文件的保存方式:

一个是顺序索引,就是根据值的顺序排序的(这个文件里面的值,也就是为其建索引的字段值,是顺序的放在索引文件里面)。

另外一个是散列索引,就是将值平均分配到若干散列桶中,通过散列函数定位的。

顺序索引中如果被索引的字段本身按照一定的顺序排序,那么这种索引叫做聚集索引,否则叫做非聚集索引。

如果被索引的字段的每个值都有一个索引与其对应,那么这种索引叫做稠密索引,否则叫做稀疏索引。

顺序索引分为两类,单级索引(不怎么用)和多级索引(通常是B+树,大量使用)。

 

B+树最常用,性能也不差,用于范围查询和单值查询都可以。特别是范围查询,非得用B+树这种顺序的才可以了。

HASH的如果只是对单值查询的话速度会比B+树快一点,但是ORACLE好像不支持HASH索引,只支持HASH表空间。

(参考资料:http://blog.csdn.net/coolzyt/article/details/4085678)

 

三、关于统计报表的性能优化

一般来说统计报表的查询SQL计算和关联关系都比较复杂,如果真的一句Sql查询出一张报表所需要的结果集其实是很耗时的(原来自己就干过这种事,一句Sql几十行,汗...)。其实对于报表,可以采用如下方法调优:

1、分页处理:

在左连接或子查询的最内层查询中使用LIMIT限制结果集大小,最大程度的保证后面对小结果集进行操作。

2、只查询基础数据:

在统计报表的查询SQL中有很多表达式计算或者需要连接多张其它表时,可以只查出需要计算的列后使用程序在内存中计算,或者只查出关联Id后,在程序中使用该Id到另一张表里再查一次(也方便使用Cache,见下文)。这样确实比一句Sql关联出所有结果集更快。

3、使用Cache:

如果分页后的结果集数量还是比较大,例如100条记录每页。那么如果将这100条记录中的某id拿出来到另外一张关联表里查一次的话,也就需要查 100次,这其实也是比较耗时间的。即使用连接池进行单表sql查询,实践发现总用时也在1秒以上,毕竟每次重新连接也要消耗时间。所以,这里可以使用一 些<K,V>的缓存来减少到数据库中查询的次数,例如memcached或redis等...但是这也加大了程序的复杂度,比如设计缓存粒度 的大小(对某列缓存还是对整个报表结果缓存)、同步缓存内容的时机以及失效时间等多方面的问题。不过如果使用得当的话,确实可以提升不少统计报表的查询性 能。

4、尽量不使用跨库join:

在Mysql中提供了一个跨库join的功能,就是查询sql中将表名前面加数据库名:dbname.tablename的形式,即可关联另外一个 数据库中的表了。这个跨库join对于那些sql简单且表数量小的查询确实很方便,但是对于数据量大的表,而且比较复杂的SQL查询就比较费时了,不建议 使用。实际工作中我使用了定时程序把另外一个库表中需要的列加载到统计库的一张表内,然后再直接join统计库中的表来实现避免跨库join。

 

PS:

SQL优化续篇 http://shensy.iteye.com/blog/1887786

分享到:
评论

相关推荐

    非常好的数据库优化教程02

    【非常棒的数据库优化教程02】 在数据库管理中,优化是提高系统性能的关键环节,尤其是在处理大量数据和复杂查询时。本章节主要探讨如何利用MySQL进行有效的数据库优化,包括索引的使用、选择合适的列类型、优化SQL...

    有关数据库优化以及优化措施方面的论文

    数据库优化工具在这一过程中也起着重要作用。ORACLE提供了各种工具,如SQL*Plus、DBMS_XPlan、AWR(Automatic Workload Repository)和ASH(Active Session History),帮助管理员分析性能瓶颈,生成执行计划,监控...

    mysql数据库优化的学习心得

    MySQL 数据库优化技巧总结 MySQL 数据库优化是数据库管理和开发者非常关心的一个问题。由于 MySQL 数据库的性能优化可以直接影响到整个应用系统的性能和用户体验,因此掌握 MySQL 数据库优化技巧对开发者和数据库...

    sql数据库优化方案

    在IT行业中,数据库优化是提升系统性能的关键环节,尤其是在处理大量数据时,SQL数据库的优化显得尤为重要。本文将深入探讨SQL数据库优化方案,包括查询优化、索引优化、存储优化和架构优化等策略,旨在帮助你提升...

    SQL数据库优化工具

    当数据库性能下降时,"SQL数据库优化工具"就显得至关重要。这些工具能够帮助我们诊断问题、提高查询效率并优化整体数据库结构,确保系统运行顺畅。 一、SQL查询优化 SQL查询优化是数据库优化的关键部分,它涉及到...

    mysql数据库优化方案(值得学习)

    简单描述数据库优化方案,以及数据库一些常用的操作,包括一些简单的查询语句,函数使用,合适学习mysql的读者。 简单描述数据库优化方案,以及数据库一些常用的操作,包括一些简单的查询语句,函数使用,合适学习...

    数据库优化大全(面试常问到)

    数据库优化是IT领域中至关重要的一个环节,尤其是在大数据量、高并发的系统中,数据库性能的优劣直接影响到系统的响应速度和用户体验。本压缩包包含了关于数据库优化的多个文档,如"SQL语句优化.doc"、"数据库优化:...

    《数据库优化与集成之实战和效果 郑保卫》PDF课件

    《数据库优化与集成之实战和效果》是由郑保卫编著的一本关于数据库管理与优化的专业教材,主要针对数据库系统在实际应用中的性能提升和不同数据库的整合策略进行深入探讨。PDF课件形式使得读者可以方便地在线学习或...

    SQL数据库优化方法

    在IT领域,数据库优化是确保系统性能的关键环节,特别是对于SQL Server这样的大型关系型数据库管理系统。本文将深入探讨SQL数据库的优化方法,包括网络优化、硬件优化、操作系统优化、数据库参数调整以及应用程序...

    Oracle数据库优化详解

    Oracle数据库优化是一门深入的技术领域,它关系到数据库性能的提升和资源的高效利用。本文针对Oracle数据库的优化提供了详尽的指导和案例分析,尤其强调了在CBO(Cost-Based Optimizer,基于成本的优化器)模式下的...

    C#源码 访问ACCESS数据库 通过反射调用命令 清理数据库 执行数据库优化 压缩操作

    数据库优化包括多个方面,如索引优化、查询优化和存储优化。在Access中,可能需要检查和调整索引以提高查询速度,分析查询性能,以及合理分配内存资源。C#可以通过执行存储过程或者自定义的SQL脚本来完成这些任务,...

    sql server 2005数据库优化方法

    在SQL Server 2005中,数据库优化是提高系统性能和效率的关键环节。本文将介绍两种主要的数据库优化工具:SQL Server Profiler和数据库引擎优化顾问(Database Engine Tuning Advisor),以及它们如何帮助DBA们更好...

    ORACLE数据库优化基础培训.zip

    进行Oracle数据库优化是提升系统性能、确保数据高效稳定运行的关键。本次基础培训将重点聚焦在SQL语句性能优化、数据库的常用管理命令以及常见问题处理上。 一、Oracle之SQL语句性能优化 SQL(Structured Query ...

    Oracle 数据库优化技术手册.pdf

    Oracle数据库优化是一项系统工程,涉及程序设计、操作系统优化、硬件配置、数据库配置以及SQL语句等多个层面。为了提高Oracle数据库的性能,需要对这些层面进行综合考虑,逐一优化。 首先,硬件优化是基础,主要...

    ( 数据库优化方面.rar )

    ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面...

    数据库优化培训课件

    数据库优化培训课件,供大家一起参考学习。

    oracle 数据库优化

    Oracle数据库优化是一个复杂而关键的领域,涉及到许多层面,包括SQL查询优化、索引策略、内存结构调整、数据库架构设计以及硬件配置等。以下将详细阐述这些知识点。 首先,SQL查询优化是数据库优化的核心部分。...

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    接下来,"数据库SQL优化总结之百万级数据库优化.pdf"可能深入到实际的优化实践。 1. **数据库架构设计**:在百万级数据量下,合理的设计能避免性能瓶颈,如垂直分割、水平分割,以及读写分离策略。 2. **缓存与...

Global site tag (gtag.js) - Google Analytics