前言:

最近一段时间总是会收到数据库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优化:大表关联小表->拆解为单表查询相关推荐

  1. 数据库sql优化总结之5--数据库SQL优化大总结

    数据库SQL优化大总结 小编最近几天一直未出新技术点,是因为小编在忙着总结整理数据库的一些优化方案,特此奉上,优化总结较多,建议分段去消化,一口吃不成pang(胖)纸 一.百万级数据库优化方案 1.对 ...

  2. SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

    大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 今天给大家,带来的是 SELF JOIN的应用 下面是,表结构和,INSERT 语句脚本. create table t0718 (idx in ...

  3. 现代密码学大作业(一):实现单表替换的频率分析(python3.7)

    现代密码学大作业(一):实现单表替换的频率分析 (知识水平.技能能力有限,如有不足之处,还望多多批评指正) 单表代替是最基础的一种加密方式.在加密时用一张自制字母表上的字母来代替明文上的字母(比如说A ...

  4. mysql 评价表设计_来聊聊mysql单表评论系统怎么设计

    评论系统对于一个网站来说几乎是必不可少的,当然评论系统的设计也多种多样.一般情况下,评论数据表会和一个用户信息表结合使用,就是在评论表中记录的有用户id(例如user_id),然后查询评论数据的时候根 ...

  5. 数据库SQL优化大总结之百万级数据库优化方案

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  6. 数据库 SQL 优化大总结之:百万级数据库优化方案

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  7. 数据库SQL优化大总结之 百万级数据库优化方案(转)

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  8. 数据库SQL优化大总结之 百万级数据库优化方案(转载)

    原文地址:http://www.cnblogs.com/yunfeifei/p/3850440.html 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错 ...

  9. mysql数据库 性别 优化_BATJ解决千万级别数据之MySQL 的 SQL 优化大总结

    引用 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率. 目前常用的 SQL 优化方式包括但不限于:业务层优化.SQL 逻 ...

最新文章

  1. Java远程方法调用
  2. 第五章 PX4-Pixhawk-GPS解析
  3. 马云马化腾,过的哪个冬
  4. 《采访中收集程序猿》学习记录5
  5. 常见linux服务器系统异常问题
  6. int n引发的中断应用——编写中断7CH的中断例程
  7. swift 拖动按钮_ios – Swift中可拖动的UIButton / Elements?
  8. Tuxedo中间件开发和管理
  9. java实现换行_java写文件实现换行
  10. 企业股权价值评估:市场法及收益法的评估思路
  11. android(6.0,11.0)开启wifi热点
  12. 性能测试——系统业务指标
  13. mysql参数化查询 in_mysql in 查询参数化
  14. Eclipse使用入门
  15. [Java8新特性]Collectors源码阅读-1 toCollections和joining等
  16. matlab温度等值线图函数,matlab等值线图
  17. 什么是面向对象编程(Java)
  18. 线性稳压电源和开关稳压电源
  19. adobe reader java_请问,如何用JAVA读PDF文件在浏览器中显示,不需要在本地系统中安装Adobe Reader。求java代码...
  20. 将地质图(shp文件)叠加到天地图上

热门文章

  1. 外媒全方位展示PS5包装盒8K/4K120/HDR 公布数据转移方法
  2. linux yast 软件管理_SUSE Linux 特色管理工具YaST
  3. 大冬天干什么最有仪式感
  4. 45分钟玩转PR(Adobe Premiere)-在线课程特效剪辑(干货分享)
  5. html5如何编写六角形,详解基于 Canvas 手撸一个六边形能力图
  6. 纯属搞笑,要是真的就太。。。
  7. linux 远程挂载摄像头_NFS在centos下的安装,摄像头挂载NFS
  8. SQL语句排序与分页
  9. python撩妹技能_技术撩妹 | 我是如何用Python搞定女神的联系方式的?
  10. 基于python的爬虫贴吧的代码