一些关于SQL优化的总结
由于这个项目一直都是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优化的总结的更多相关文章
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
- sql 优化
1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...
- SQL 优化总结
SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects SELECT name as '函数名称',xtype as XType FROM s ...
- (转)SQL 优化原则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- sql优化阶段性总结以及反思
Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...
- ORACLE常用SQL优化hint语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...
- SQL优化有偿服务
本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ...
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
随机推荐
- ssh-免密登录批量发送脚本
1.新建node文件(文件中为需要发送的节点,不能包含主文件服务器) node01 node02 node03 node04 2.ssh的免密登录批处理脚本(需要同级目录下的nodes文件) #!/b ...
- cleanmymacchinese下载链接
由于新的chinese版本还没有公开发布下载链接,所以找到如下地址 https://dl.devmate.com/com.macpaw.zh.CleanMyMac3/CleanMyMacChinese ...
- zookeeper视图工具
https://www.cnblogs.com/xd502djj/p/8919425.html
- emacs 集成astyle
https://stackoverflow.com/questions/8115460/emacs-save-excursion-not-restoring-point https://github. ...
- 在Centos7下安装nghttp2
如果是Ubuntu18.04, 系统本身已经带了nghttp2了, 直接apt安装就可以. 下载源代码 https://github.com/nghttp2/nghttp2 如果是在Ubuntu下编译 ...
- jetty9.4缓存文件目录自定义
jetty9.4安装包解压之后,有几个修改的地方和jetty7.6有不同,需要单独注意一下: 1. 端口设置 端口设置在${jetty_home}/start.ini中 2. 缓存文件生成目录 项目通 ...
- input文件上传(上传单个文件/多选文件/文件夹、拖拽上传、分片上传)
//上传单个/多个文件 <input title="点击选择文件" id="h5Input1" multiple="" accept= ...
- Object type TYPE failed to create with error
ORA-39083: Object type TYPE failed to create with error: ORA-02304: invalid object identifier litera ...
- mysql使用自增Id为什么存储比较快
转自:https://blog.csdn.net/bigtree_3721/article/details/73151028 InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表( ...
- 【资料下载区】【iCore系列及其它模块相关文档】更新日期2017/07/24
iCore系列双核心板原理图下载区 iCore双核心板原理图下载(注释版)iCore1s双核心板原理图下载iCore2双核心板原理图下载iCore3双核心板原理图下载iCore4双核心板原理图下载 i ...