SQL调优与报表的性能优化
原文链接:https://www.iteye.com/blog/shensy-1664549 作者:shensy
一、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。
一、SQL优化的基本思想:
1、 最小化结果集数据量。
Sql所需处理的资源总量/Sql单位时间所能处理的资源量=Sql执行时间
所以为减少Sql执行时间:
(1)可以增大Sql单位时间所能处理的资源量。
(2)可以减少Sql所需处理的资源总量。
常见的是方法(2),即减少Sql所需处理的资源总量,就是减少执行sql所处理的行数。
2、 减少全表扫描。
减少全表扫描,主要手段就是建立索引,索引就好比一本书的目录,当你需要查询某篇文章时,不需要从头到尾把书的每页都查一遍,直接看目录就能找到了。
在没有建索引的情况下,从数据库查找某一条数据,就必须进行全表扫描,即对所有数据进行一次遍历。但即使在建立了索引的情况下,也会出现类似情况发生,因此要尽量避免全表扫描。
二、优化方法:
结合上面两点,总结如下:
1、 尽量减少对数据库的访问次数。
多次连接数据库会消耗大量时间,能用一句SQL查出来的尽量不要使用多个SQL查。
2、尽量把使用索引的列放在where条件首列。
3、不要过多地使用通配符*,而是使用查询列。
4、避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描。
考虑将null的列设置默认值0.
5、尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
6、避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
7、in和not in也要慎用,IN会使系统无法使用索引,而只能直接搜索表中的数据。
考虑使用between … and …
8、尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
SELECT * FROM table1 WHERE col1 LIKE ‘%L%’
改为:
SELECT * FROM table1 WHERE col1 LIKE ‘L%’
9、尽量避免在 where 子句中对字段进行表达式操作,不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算
SELECT * FROM table1 WHERE col1/2=100
10、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
11、尽量把使用的索引放在选择的首列。
SQL调优与报表的性能优化相关推荐
- mysql报表统计 优化_关于SQL调优与报表的性能优化
前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化. 其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨. 本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库 ...
- Java虚拟机这一块 —— JVM 调优和深入了解性能优化
JVM 调优和深入了解性能优化 JVM 调优的本质 GC 调优原则 调优的原则 目的 GC 调优 调优步骤 日志分析 阅读 GC 日志 -XX:+UseSerialGC -XX:+UseParNewG ...
- JVM性能调优6_深入了解性能优化__享学课堂
常用的性能评价/测试指标 响应时间 提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间. 如:数据库查询花费的时间,将字符回显到终端上花费的时间,访问 Web 页面花费的时 ...
- sql优化的方法及思路_合理的sql优化思路--如何缩短SQL调优时间?
概述 当生产环境发生故障或者系统特别慢的时候,这时候你从awr报告拿到有问题的sql,但是优化的时候却优化了很久还没解决,这时候在领导或者客户面前就不太好了...那么我们怎么去缩短sql调优的时间,一 ...
- SQL调优指南笔记19:Influencing the Optimizer
本文为SQL Tuning Guide第19章"Influencing the Optimizer"的笔记. 重要基本概念 driving table The table to w ...
- 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解
<高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...
- oracle trim 性能,ORACLE sql调优之记录一次trim函数引发的大表全表扫描
2017年8月14日,一地市oracle相关的调度程序ETL抽取速度奇慢,sql语句每次执行平均时间要9秒左右,如果所示: 该调度过程涉及的sql语句如下: select count(*) from ...
- Oracle Hints,Oracle并行模式(Parallel) /*+parallel(t,4)*/ 在SQL调优中的重要作用
/*+parallel(t,4)*/在SQL调优中的重要作用! 2013年11月17日 12:59:24 雾里看花5566 阅读数:5422更多 个人分类: 数据库-oracle 谈谈HINT /*+ ...
- 读《程序员的SQL金典》[4]--SQL调优
一.SQL注入 如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞.避免的方式有两种: 1. 对于用户输入过滤敏感字母: 2. 参数化SQL(推荐). 二.索引 ①索引分类 聚簇索引 ...
最新文章
- python下载安装教程图解-一招解决:各种版本的Python下载安装教程
- python 指针_指针篇 | 指针的灵活让我想起了Python
- python接口测试非json的断言_荐在接口自动化测试中,如何利用Pytest + JSONPath 进行接口响应断言...
- 怎么理解python语言_Python语言入门1-理解Python语言
- android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升
- 比特币一种点对点的电子现金系统是哪一年诞生的_阎王解读比特币白皮书:点对点电子现金系统...
- css如何设置文本垂直居中显示,css中怎么设置文本居中?css文本垂直居中的设置方法...
- 手机视频监控系统小结
- Java IO(输入输出)
- 提高网站访问速度的方法汇总
- 拟合优度:Pearson 卡方检验
- 连接上局域网打开计算机卡,win7怎么玩局域网游戏,win7怎么玩局域网游戏卡
- 解决 Chrome最新版右键工具中的编码修改功能没有了的工具
- tm影像辐射定标_「教程」遥感图像预处理之辐射定标
- c语言中乘法和除法哪个优先,C语言运算符和优先级
- 马哥教育的python课程到底好不好_马哥教育的网络授课怎么样?
- 基于python的招聘网站分析
- LF-YOLO: A Lighter and Faster YOLO for Weld Defect Detection of X-ray Image
- paas平台_paas平台排名
- 注册微信公众平台测试账号
热门文章
- 百度AR增强现实集成
- box-shadow的多种用法
- [转帖]江湖经验:喝酒的学问技巧,社会新人一定要看~!
- 微信小程序的video组件,更改播放按钮
- linux自动网络对时
- 每日新闻丨华为被拘留前员工再回应;亚马逊云发布量子计算服务Braket预览;硅谷“六巨头”10年避税超千亿美元...
- 当时间管理高手[zz]
- 请分析计算机测色配色的缺点,测色与配色分析.doc
- OJB中的多表查询和更新
- F - LIS on Tree【二分OR权值线段树】