sql优化中in关键字_工作中遇到的一个SQL优化问题与解决方案
我们公司是做汽车服务行业SCRM门店管理系统的,其中一个功能是查出该门店的所有会员与之对应的车辆。有三张表,核心字段如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
需求:查出某个门店下的所有会员与车辆列表(会员姓名,车辆品牌,车牌号,车标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优化问题与解决方案相关推荐
- panda提取时间戳中的日期_工作中常用的十个日期时间计算公式,你一定要收藏...
1.计算本月天数 在单元格输入公式:=DAY(EOMONTH(TODAY(),0)) 后将格式改为常规. 2,计算年龄 在C4单元格输入公式:=DATEDIF(B4,TODAY(),"y&q ...
- 工作缺点和不足及措施_工作中的缺点有哪些?
展开全部 1.工作中的不足: 工作中与领导和大家沟通较少,在与人沟通中不能很好的把握交流.沟通的技巧,遇62616964757a686964616fe58685e5aeb931333365633935 ...
- VBA将excel中的多个工作表sheet合成一个工作表,多个工作簿的多个工作表合并为一个工作簿
1 将excel中的多个工作表sheet合成一个工作表 工作表合成前: 工作表合成后: **第一步:**在文件中新建一个工作表sheet,用来存放合成后的数据,如图所示: 第二步:点击"开发 ...
- 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- 将excel中的多个工作表sheet合成一个工作表
上篇说到将excel中的一个工作表按照某列拆分成多个sheet工作表,那么如何把excel中的多个工作表sheet合成一个工作表呢?接下来就继续利用VBA工具来解决这个问题. 工作表合成前: 工作表合 ...
- sql是否包含多个字符串_工作中遇到的99%SQL优化,这里都能给你解决方案
点击上方"小强的进阶之路",选择"星标"公众号 重磅干货,第一时间送达! 预计阅读时间:8分钟 前几篇文章介绍了mysql的底层数据结构和mysql优化的神器e ...
- mysql中limit关键字_【JAVA】关于mysql的limit关键字使用。
在WEB项目中我们经常会使用到分页,分页有很多中,一种是放在内存中,由java代码控制分页:另一种是直接用sql进行数据库分页: 放在内存中进行分页这肯定是不太现实的,如果数据量过大,会导致内存爆掉. ...
- java中变量 关键字_基于java的voliate关键字详解
voliate关键字的作用: 一.内存可见性 基于缓存一致性协议,当用voliate关键字修饰的变量改动时,cpu会通知其他线程,缓存已被修改,需要更新缓存.这样每个线程都能获取到最新的变量值. 二. ...
- hashmap应用场景_工作中常用到的Java集合有哪些?应用场景是什么?
秋招Java面试大纲:Java+并发+spring+数据库+Redis+JVM+Netty等 疫情期间"闭关修炼",吃透这本Java核心知识,跳槽面试不心慌 Spring全家桶笔记 ...
最新文章
- 【java】暑期需要复习的操作
- FPGA设计心得(10)关于行为仿真的一点观点
- 阅读笔记一——java高并发的性能优化
- 入门linux经典书籍--linux从入门到精通
- Windows Phone MultiBinding :Cimbalino Toolkit
- shp与json互转(转载)
- @微信官方,给我微信旁边加个福字
- java中国象棋网络对弈,java课程设计---中国象棋对弈系统
- (很全面)SpringBoot 使用 Caffeine 本地缓存
- 中国开发者真实画像:Java长盛,偏爱Windows操作系统,鲜少参与开源项目
- 通过AT指令实现ESP8266模块和TCP服务器的数据传输
- 51cto shell mysql备份数据库_shell脚本备份MYSQL数据库
- matlab中gui对话框,Matlab GUI之通用对话框
- ES3~ES6数组的方法总结
- 小胡学python【1】
- 信息学奥赛一本通:1135:配对碱基链
- 代码编辑器--5.21
- 《系统设计》微服务不是银弹
- oracle 查询group by的字段之外的字段
- ROS 控制实际工业机器人(Staubli tx90)(二)
热门文章
- ubantu安装coturn穿透服务器
- 2021 腾讯技术十大热门文章
- 首届“开悟AI+游戏高校大赛”启动
- MIP、PWA、WebGL、HTTPS,来看Web生态的领先技术
- npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! iview-admin@2.0.0 dev: `vue-cli-service serve
- Flink 在小红书推荐系统中的应用
- Spring Boot JPA的查询语句
- hadoop2.20+hive+sqoop+mysql数据处理案例
- 洛谷——P1093 奖学金
- Leecode 1218. 最长定差子序列——Leecode每日一题系列