记录一次慢SQL优化:大表关联小表->拆解为单表查询
前言:
最近一段时间总是会收到数据库CPU报警
一查发现有一个特别慢的SQL,调用的频率很高,并且查一次SQL15s以上,十分影响性能
SQL分析
这个sql是一个分页查询的sql,每次查出10条主表是cfg_category_organization (大约50W+数据)
需要补充部分信息:cfg_category (大约1000条数据)、cfg_org (大约2W数据)
按说这个数据量不大,但是就是非常慢
selectb.*,co.organization_path,co.organization_full_name,a.name,a.status
fromcfg_category_organization b
inner join cfg_category a on b.category_id = a.id
inner join cfg_org co on b.organization_code = co.organization_code
whereb.is_delete = 0and co.is_delete = 0and a.is_delete = 0and co.organization_path like concat('/001/002/003/004', "%")and b.category_id = 7
order byb.status desc,b.update_time desc
limit 10;
用explain看一下,发现表cfg_category 、cfg_org 的rows是很少的,只有cfg_category_organization 几乎进行了全表扫描,开销较大。
SQL优化
因此我们可以采用,把小表查询出来的结果作为条件,in到大表中,并且对应的大表字段都是有索引的
1.cfg_category 表单独拎出来作为一个SQL,当有这张表的字段作为查询条件时,就select出这张表的key:
select id from cfg_category where is_delete = 0 and id = 7
如果说返回参数为0,后面的内容均不需要查了,肯定联查不出来任何数据,这样就减少了一小部分无效查询
2.同理cfg_org 表也单独拎出来,如果有这张表的字段作为查询条件的时候,就select出这张表的key:
select organization_code from cfg_org where is_delete = 0 and organization_path like concat('/001/002/003/004', "%")
同理,如果说返回参数为0,后面的内容均不需要查了,肯定联查不出来任何数据,这样就减少了一小部分无效查询
3.如果前两步都能查出对应的数据,则对最大的表进行查询:
selectb.*
fromcfg_category_organization b
whereb.is_delete = 0and b.organization_code in('004', '005')and b.category_id in (7)
order byb.status desc,b.update_time desc
limit 10
如果说没有任何查询条件,则SQL就是如下情况:
selectb.*
fromcfg_category_organization b
whereb.is_delete = 0
order byb.status desc,b.update_time desc
limit 10
分页查询,充其量单表查询返回的结果就是10条,那么查出的10条,再组装一下,category_id 、organization_code 字段,分别去小表查一次,再利用Java代码拼接出来即可
select name,status from cfg_category where id in (7);
select organization_path,organization_full_name from cfg_org where organization_code in ('004','005');
优化后效果不错:平均15-20s查询的慢SQL,优化到0.3-0.6s
总结与改进
在上面优化,将一次慢SQL查询修改为5次单表查询+Java代码的辅助拼接,实际上还可以再次优化,如果说cfg_category 、cfg_org是有字段作为查询条件的,那么在前面查的那次就可以将对应的信息查出来,然后利用java代码获取key值(category_id、organization_code)
并且,根据业务场景来说,这两张小表的更新频率是比较低的,可以按照查询条件来做缓存,较少数据库的压力,进一步优化。
以上就是本次优化的心得,欢迎大家与我交流~
记录一次慢SQL优化:大表关联小表->拆解为单表查询相关推荐
- 数据库sql优化总结之5--数据库SQL优化大总结
数据库SQL优化大总结 小编最近几天一直未出新技术点,是因为小编在忙着总结整理数据库的一些优化方案,特此奉上,优化总结较多,建议分段去消化,一口吃不成pang(胖)纸 一.百万级数据库优化方案 1.对 ...
- SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 今天给大家,带来的是 SELF JOIN的应用 下面是,表结构和,INSERT 语句脚本. create table t0718 (idx in ...
- 现代密码学大作业(一):实现单表替换的频率分析(python3.7)
现代密码学大作业(一):实现单表替换的频率分析 (知识水平.技能能力有限,如有不足之处,还望多多批评指正) 单表代替是最基础的一种加密方式.在加密时用一张自制字母表上的字母来代替明文上的字母(比如说A ...
- mysql 评价表设计_来聊聊mysql单表评论系统怎么设计
评论系统对于一个网站来说几乎是必不可少的,当然评论系统的设计也多种多样.一般情况下,评论数据表会和一个用户信息表结合使用,就是在评论表中记录的有用户id(例如user_id),然后查询评论数据的时候根 ...
- 数据库SQL优化大总结之百万级数据库优化方案
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 数据库 SQL 优化大总结之:百万级数据库优化方案
网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...
- 数据库SQL优化大总结之 百万级数据库优化方案(转)
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 数据库SQL优化大总结之 百万级数据库优化方案(转载)
原文地址:http://www.cnblogs.com/yunfeifei/p/3850440.html 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错 ...
- mysql数据库 性别 优化_BATJ解决千万级别数据之MySQL 的 SQL 优化大总结
引用 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率. 目前常用的 SQL 优化方式包括但不限于:业务层优化.SQL 逻 ...
最新文章
- Java远程方法调用
- 第五章 PX4-Pixhawk-GPS解析
- 马云马化腾,过的哪个冬
- 《采访中收集程序猿》学习记录5
- 常见linux服务器系统异常问题
- int n引发的中断应用——编写中断7CH的中断例程
- swift 拖动按钮_ios – Swift中可拖动的UIButton / Elements?
- Tuxedo中间件开发和管理
- java实现换行_java写文件实现换行
- 企业股权价值评估:市场法及收益法的评估思路
- android(6.0,11.0)开启wifi热点
- 性能测试——系统业务指标
- mysql参数化查询 in_mysql in 查询参数化
- Eclipse使用入门
- [Java8新特性]Collectors源码阅读-1 toCollections和joining等
- matlab温度等值线图函数,matlab等值线图
- 什么是面向对象编程(Java)
- 线性稳压电源和开关稳压电源
- adobe reader java_请问,如何用JAVA读PDF文件在浏览器中显示,不需要在本地系统中安装Adobe Reader。求java代码...
- 将地质图(shp文件)叠加到天地图上
热门文章
- 外媒全方位展示PS5包装盒8K/4K120/HDR 公布数据转移方法
- linux yast 软件管理_SUSE Linux 特色管理工具YaST
- 大冬天干什么最有仪式感
- 45分钟玩转PR(Adobe Premiere)-在线课程特效剪辑(干货分享)
- html5如何编写六角形,详解基于 Canvas 手撸一个六边形能力图
- 纯属搞笑,要是真的就太。。。
- linux 远程挂载摄像头_NFS在centos下的安装,摄像头挂载NFS
- SQL语句排序与分页
- python撩妹技能_技术撩妹 | 我是如何用Python搞定女神的联系方式的?
- 基于python的爬虫贴吧的代码