我们公司是做汽车服务行业SCRM门店管理系统的,其中一个功能是查出该门店的所有会员与之对应的车辆。有三张表,核心字段如下:

需求:查出某个门店下的所有会员与车辆列表(会员姓名,车辆品牌,车牌号,车标logo)

比如store_id=1的本店下的所有会员车辆列表,每次只取出20条:

第一次优化

分析:需要三张表相连,其中一个会员可能有多辆车,所以车辆表必然比会员表的记录多,而会员表可通过门店store_id只筛选出本店的会员。由此可见,先查出本门店会员再与车辆表相连,再与车品牌表相连,在会员表的storeid和车辆表的mid和车品牌表brand_code上建索引,这种连接顺序,IO成本比较小,是一种不错的方案。

比如

member_base 1000条

where store_id走索引之后只真正取出100条

连接 car_base 1500条,走mid索引真正取出120条

连接 car_brand 50条 走id索引 取出1条

总IO成本为100+120+1=230

推算其他几种连接顺序方案与这种对比,IO成本都不如这种少

故使用left join 强制左表连右表:

select name,brand_name,cpai,brand_logo

from member_base as m left join car_base as c on m.id=c.mid

left join car_brand as b on c.brand_code=b.id

where m.store_id=? limit 20 ;

(mysql查询优化器会自动先where筛选出member_base会员表store_id本门店的会员,再join)

第二次优化

有时候为了追求更好的查询效率,可在车辆表甚至会员表做字段冗余,减少join连表的。

比如在车辆表,添加需要查出的brand_name和brand_logo字段,这样我们只需要会员表与车辆表总共两张表相连即可。(sql省略)

第三次优化

由于我们每次只取出limit 20条的记录,我们首次在查会员表的时候,一般该门店的会员不都只有20条记录这么少,我记得系统中很多门店的会员数量都在1千条以上,那么这个时候,再与车辆表相连的时候,会把会员表每一条记录的id都在整个车辆表查一遍,共查了1000次,这是非常不划算的。(sql语句的执行顺序通常是先 join on 后 where 后 group by 后 统计函数 后 having 后 order by 最后才执行limit )

解决方案

先在会员表取出门店的20条记录会员,再与车辆表join

select * from (select * from member_base where store_id=? limit 20) as m left join car_base as c on m.id=c.mid

最终只在车辆表查询20次即可。

sql优化中in关键字_工作中遇到的一个SQL优化问题与解决方案相关推荐

  1. panda提取时间戳中的日期_工作中常用的十个日期时间计算公式,你一定要收藏...

    1.计算本月天数 在单元格输入公式:=DAY(EOMONTH(TODAY(),0)) 后将格式改为常规. 2,计算年龄 在C4单元格输入公式:=DATEDIF(B4,TODAY(),"y&q ...

  2. 工作缺点和不足及措施_工作中的缺点有哪些?

    展开全部 1.工作中的不足: 工作中与领导和大家沟通较少,在与人沟通中不能很好的把握交流.沟通的技巧,遇62616964757a686964616fe58685e5aeb931333365633935 ...

  3. VBA将excel中的多个工作表sheet合成一个工作表,多个工作簿的多个工作表合并为一个工作簿

    1 将excel中的多个工作表sheet合成一个工作表 工作表合成前: 工作表合成后: **第一步:**在文件中新建一个工作表sheet,用来存放合成后的数据,如图所示: 第二步:点击"开发 ...

  4. 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. 将excel中的多个工作表sheet合成一个工作表

    上篇说到将excel中的一个工作表按照某列拆分成多个sheet工作表,那么如何把excel中的多个工作表sheet合成一个工作表呢?接下来就继续利用VBA工具来解决这个问题. 工作表合成前: 工作表合 ...

  6. sql是否包含多个字符串_工作中遇到的99%SQL优化,这里都能给你解决方案

    点击上方"小强的进阶之路",选择"星标"公众号 重磅干货,第一时间送达! 预计阅读时间:8分钟 前几篇文章介绍了mysql的底层数据结构和mysql优化的神器e ...

  7. mysql中limit关键字_【JAVA】关于mysql的limit关键字使用。

    在WEB项目中我们经常会使用到分页,分页有很多中,一种是放在内存中,由java代码控制分页:另一种是直接用sql进行数据库分页: 放在内存中进行分页这肯定是不太现实的,如果数据量过大,会导致内存爆掉. ...

  8. java中变量 关键字_基于java的voliate关键字详解

    voliate关键字的作用: 一.内存可见性 基于缓存一致性协议,当用voliate关键字修饰的变量改动时,cpu会通知其他线程,缓存已被修改,需要更新缓存.这样每个线程都能获取到最新的变量值. 二. ...

  9. hashmap应用场景_工作中常用到的Java集合有哪些?应用场景是什么?

    秋招Java面试大纲:Java+并发+spring+数据库+Redis+JVM+Netty等 疫情期间"闭关修炼",吃透这本Java核心知识,跳槽面试不心慌 Spring全家桶笔记 ...

最新文章

  1. 【java】暑期需要复习的操作
  2. FPGA设计心得(10)关于行为仿真的一点观点
  3. 阅读笔记一——java高并发的性能优化
  4. 入门linux经典书籍--linux从入门到精通
  5. Windows Phone MultiBinding :Cimbalino Toolkit
  6. shp与json互转(转载)
  7. @微信官方,给我微信旁边加个福字
  8. java中国象棋网络对弈,java课程设计---中国象棋对弈系统
  9. (很全面)SpringBoot 使用 Caffeine 本地缓存
  10. 中国开发者真实画像:Java长盛,偏爱Windows操作系统,鲜少参与开源项目
  11. 通过AT指令实现ESP8266模块和TCP服务器的数据传输
  12. 51cto shell mysql备份数据库_shell脚本备份MYSQL数据库
  13. matlab中gui对话框,Matlab GUI之通用对话框
  14. ES3~ES6数组的方法总结
  15. 小胡学python【1】
  16. 信息学奥赛一本通:1135:配对碱基链
  17. 代码编辑器--5.21
  18. 《系统设计》微服务不是银弹
  19. oracle 查询group by的字段之外的字段
  20. ROS 控制实际工业机器人(Staubli tx90)(二)

热门文章

  1. ubantu安装coturn穿透服务器
  2. 2021 腾讯技术十大热门文章
  3. 首届“开悟AI+游戏高校大赛”启动
  4. MIP、PWA、WebGL、HTTPS,来看Web生态的领先技术
  5. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! iview-admin@2.0.0 dev: `vue-cli-service serve
  6. Flink 在小红书推荐系统中的应用
  7. Spring Boot JPA的查询语句
  8. hadoop2.20+hive+sqoop+mysql数据处理案例
  9. 洛谷——P1093 奖学金
  10. Leecode 1218. 最长定差子序列——Leecode每日一题系列