由于这个项目一直都是mysql所以写点mysql的

1.数据存储引擎的选择,MyISAM 和 InnoDB 的选择

InnoDB 一般都会选择这个,但是如果真的涉及到一些不涉及增删的表,可以考虑下MyISAM 该引擎不支持事务,不支持外键,优点就是访问速度快,如果都是查询的话,这个存储引擎可能会使你的效率更高点

2.查询SQL中添加 limit 我们项目组SQL规范中都有写,任何查询都应该加上 limit ,这么做有两个原因:1.防止表中数据过大,导致大量数据一把捞出,导致内存溢出,GG 2.在查询一条数据是加上 limit 1 会时效率更高

3.not exexists 代替 not in  not exists 查询时会走索引,而not in就没戏了,在数据量比较大的时候尤其能看出显著的效果。

4.like 关键字的使用 ‘关键字%’ 不要使用两侧都有%% 这样也会使索引失效

5.适当的创建索引

《以下都是扯犊子,一点点蛋用,还是别看下面的了》

慢SQL核查

NO.1 :com.cmos.dao.basesr.TSrProblemProcesExceptionMapper.queryExceptionCount

SELECT

count(1)

FROM

t_sr_problem_proces t1,

(

SELECT

WRKFM_ID

FROM

t_sr_problem_process_modify

GROUP BY

WRKFM_ID

) t2

WHERE

t1.ACPT_TIME >= '2018-07-31 00:00:00'

AND t1.ACPT_TIME <= '2018-08-31 23:59:59'

AND t1.TENANT_ID = '100000'

AND t1.PROV_CODE = '00030016'

AND t1.WRKFM_ID = t2.WRKFM_ID

AND t1.WRKFM_STS_CD IN ('3', '4', '5', '7', '8');

分析:

子查询的结果集t2在与t1表联合时会走全表扫描,且没有索引。

改造:

SELECT

count(distinct t1.WRKFM_ID)

FROM

t_sr_problem_proces t1,

t_sr_problem_process_modify t2

WHERE

t1.ACPT_TIME >= '2018-07-31 00:00:00'

AND t1.ACPT_TIME <= '2018-08-31 23:59:59'

AND t1.TENANT_ID = '100000'

AND t1.PROV_CODE = '00030016'

AND t1.WRKFM_ID = t2.WRKFM_ID

AND t1.WRKFM_STS_CD IN ('3', '4', '5', '7', '8');

改造后的SQL两条执行计划均走索引查询

NO.2  com.cmos.dao.basesr.TSrProblemProcesExceptionMapper.queryExceptionCount_His

SELECT

count(1)

FROM

t_sr_problem_proces_h_2018 t1,

(

SELECT

WRKFM_ID

FROM

t_sr_problem_process_modify_his_2018

GROUP BY

WRKFM_ID

) t2

WHERE

t1.ACPT_TIME >= ?

AND t1.ACPT_TIME <= ?

AND t1.TENANT_ID = ?

AND t1.PROV_CODE = ?

AND t1.WRKFM_ID = t2.WRKFM_ID

分析:

子查询的结果集t2在与t1表联合时会走全表扫描,且没有索引。

NO.3   com.cmos.service.commonsv.generator.TSrCfgHotSrtypeMapper.selectByCond

SELECT

REC_ID,

TENANT_ID,

PROV_CODE,

SRV_REQST_TYPE_ID,

CITY_CODE,

SRV_REQST_BIG_CLA_ID,

HTPOINT_SRV_REQST_TYPE_NM,

HTPOINT_SRV_REQST_TYPE_FULL_NM,

OP_STAFF_ID,

ARGE_SEQNO,

ORG_BRNCH_ID,

CRT_TIME,

MODF_TIME,

HTPOINT_SRV_TYPE_CD,

BATCH_NUM,

VALID_FLAG,

ACPT_FLAG,

BIG_CLA_NM,

LTSZ_WRKFM_FLAG,

EFF_TIME,

INVLD_TIME,

FRONT_SHOW_NM

FROM

t_sr_cfg_hot_srtype

ORDER BY

?

LIMIT ?,?

分析:

手动热点服务请求类型查询:

1.该SQL是简单的单标查询,经过排查该xml中的sql语句可以删除

distinct

2.该sql查询的字段可以看出,包含主键,因此distinct 将毫无意义,如果误传的话还会降低该查询的性能

该查询是简单的单表查询,经核查 t_sr_cfg_hot_srtype 在配置库,所有省份共用一张表,该表主键是REC_ID,在查询是REC_ID不会由前台传过来,因此where 子句中不会有 REC_ID 导致查询不会走索引查

改造: 建议对于该表新增其他列的索引

NO.4 com.cmos.service.commonsv.generator.TSrCfgHotSrtypeRuleMapper.selectByCond

SELECT

RULE_ID,

TENANT_ID,

PROV_CODE,

HTPOINT_SRV_TYPE_CD,

EMBR_CITY_FLAG,

EMBR_BIG_CLA_FLAG,

INTERVALG,

TOPN,

OP_STAFF_ID,

ORG_BRNCH_ID,

CRT_TIME,

MODF_TIME

FROM

t_sr_cfg_hot_srtype_rule

WHERE

?

ORDER BY

?

分析:

1.该SQL是简单的单标查询,经过排查该xml中的sql语句可以删除distinct

该sql查询的字段可以看出,包含主键,因此distinct 将毫无意义,如果误传的话还会降低该查询的性能

2.该表位于配置库,多省共用一张表存储数据,经查询该表仅有主键一个索引,在查询时不会传主键到where 子句中,因此导致该简单查询为全表扫描且不走索引,无论哪个省的数据量足够大都会影响其他省的正常查询。

改进:建议该表新增索引

NO.5 com.cmos.dao.basesr.TSrProcessDetailHisMapper.selectByRouteLgIds

SELECT

DSPS_PROC_ID,

TENANT_ID,

LG_ID,

ROUTE_LG_ID,

WRKFM_ID,

OP_TYPE_CD,

FCT_NO,

FCT_NM,

FCT_VAL,

DSPS_STAFF_ID,

DSPS_ORG_BRNCH_ID,

CRT_TIME,

MODF_TIME,

PROV_CODE,

ELEMENT_DISPLAY_NAME

FROM

t_sr_process_detail_his_201808

WHERE

ROUTE_LG_ID IN (?,?,?)

分析:

1.排查xml的时候,发现#{id} 没有添加jdbcType

2.以 t_sr_process_detail_his_201808 为例,该表中除主键外 还有在WRKFM_ID上有索引,但是针对该SQL WRKFM_ID 不在where子句中,因此查询为全表扫面且不走索引

改进:在 ROUTE_LG_ID 字段上添加索引

NO.6 SrPageInfo.selectCfgPageType

SELECT DISTINCT

(APP_CLFC_CD)

FROM

t_sr_page_info

WHERE

TENANT_ID = ?

AND PROV_CODE = ?

分析:

t_sr_page_info位于配置库,主键:PAGE_ID 除主键外无其他索引

该查询虽然是简单查询,但是在数据量很大的时候,全表扫面会效率极低。

改进:在PROV_CODE 字段上新增索引

查询表中索引:

show index from table_name

一些关于SQL优化的总结的更多相关文章

  1. SQL优化案例—— RowNumber分页

    将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...

  2. sql 优化

    1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...

  3. SQL 优化总结

    SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects         SELECT name as '函数名称',xtype as XType  FROM  s ...

  4. (转)SQL 优化原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  5. sql优化阶段性总结以及反思

    Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...

  6. mysql sql优化实例

    mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...

  7. SQL优化技巧

    我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...

  8. ORACLE常用SQL优化hint语句

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...

  9. SQL优化有偿服务

    本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ...

  10. 【MySQL】SQL优化系列之 in与range 查询

    首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...

随机推荐

  1. 【SQL 代码】SQL 语句记录(不定时更新)

    1.数值四舍五入,小数点后保留2位 round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位. numeric 函数的2个参数,第一个表示数据 ...

  2. 关于关键字 volatile

    关于 volatile 的使用,也是 C 语言面试的月经问题.标准答案来了: volatile is a qualifier that is applied to a variable when it ...

  3. NOIP2010普及组 导弹拦截

    导弹拦截 OJ地址: https://www.luogu.org/problemnew/show/P1158 http://codevs.cn/problem/1128/   题目描述 Descrip ...

  4. Linux如何统计进程的CPU利用率[转]

    0. 为什么写这篇博客 Linux的top或者ps都可以查看进程的cpu利用率,那为什么还需要了解这个细节呢.编写这篇文章呢有如下三个原因: * 希望在脚本中,能够以过”非阻塞”的方式获取进程cpu利 ...

  5. Java并发之线程转储

    一.java线程转储 java的线程转储可以被定义为JVM中在某一个给定的时刻运行的所有线程的快照.一个线程转储可能包含一个单独的线程或者多个线程.在多线程环境中,比如J2EE应用服务器,将会有许多线 ...

  6. atitit r9 doc on home ntpc .docx

    卷 p2soft 的文件夹 PATH 列表 卷序列号为 9AD0-D3C8 D:. │  Aittit pato 面对拒绝  的回应.docx │  Atitit  中国明星数量统计 attilax. ...

  7. Linux工作环境:CentOS7最小安装+Xfce桌面环境

    ref: https://blog.csdn.net/smstong/article/details/44802989 3.1 执行CentOS7 最小安装去官网下载CentOS-7.0-1406-x ...

  8. git忽略.idan目录

    git rm -r --cached .idea git add . git commit -m '忽略idea' git pull git push

  9. 如何知道局域网内哪些ip被占用

    诶,有时候真是略捉急,开始的时候估摸了一个网段,试了3个都没有通,觉得这个一个个试验的方法简直捉急到家了.下面就为大家分享3种简单地如何查看ip地址是否被占用的方法. 1.ping windows键+ ...

  10. [转]Eureka自我保护机制、健康检查的作用、actuator模块监控

    Eureka自我保护机制 接着以上篇文章建立的三个工程为基础(eureka-server,uerreg,myweb),默认Eureka是开启自我保护的.我们来做个测试,我们先启动三个工程,我们访问注册 ...