背景

最近遇到一个问题,实现相同功能的几个 sql 不知道哪个最优。当然直接测试可以得到最终结论,但是还是不知道为啥慢,为啥快,还可以怎么样再进行优化?这些问题没有解决。下面通过一个实例来介绍下 sql 优化神器 Explain,它可以辅助进行 sql 优化。

案例

存在两张表,第一张表是item表(10w+),存储了人力资源分配单据的概要信息(存储了id、company_id、sn),第二张表是detail(1000w+)表,存储了人力资源分配单据的详细信息(存储了id、company_id、sn和person_id)

item表存在company_id+sn的联合索引,detail表存在company_id+sn+person_id的联合索引

查询需求:在某公司的概要页(例如company_id = 123的公司),需要支持根据单据中是否存在某个人或某些人(当搜索两个人时,只要有一个人在该单据中,该单据就会被展示出来)进行查询。

下面有3条 SQL, 选出最优的那一条。

sql_1:

SELECT * FROM item WHERE company_id = 123 AND EXISTS (SELECT 1 FROM  detail WHERE detail.company_id = item.company_id AND detail.sn=item.snAND detail.person_id in (P10001, P10002));

sql_2:

SELECT * FROM item WHERE company_id = 123 AND id IN(select distinct item.id from itemLEFT JOIN detailON item.company_id = detail.company_idAND item.sn = detail.snWHEREitem.company_id= 123AND detail.person_id in (123, 321));

sql_3:

SELECT * FROM item WHERE company_id = 123 AND sn IN (SELECT DISTINCT sn FROM detailWHERE detail.company_id = 123AND detail.person_id in (123, 321));

explain分析

结论是 方案1 最优,在有索引加持下,总体来说都差不多,耗时: 方案1 < 方案3 < 方案2。具体分析过程如下:

explain 分析的使用方法很简单,就是在SQL前面加 explain 就行了,比如 explain select…from…

分别对上述SQL加explain 跑一下,得到如下结果:

这里主要关注几个点:type(访问类型),key(引用索引), extra(附加信息), rows(扫描行数)

1、首先分析 访问类型(type)
这里补充一下知识点:
ref:表示索引访问,会将索引跟参考值比较(如这里的 123),找到所有符合条件的行;
eq_ref: 同上,只是最多会返回一行
其它:all (全表扫描), index(扫描全索引),range(扫描固定范围 内的索引),const、system (可以理解成常量)
它们的执行耗时是: all > index > range > ref > eq_ref > const、 system (当然也不完全是,还要根据具体场景,有时候 index > all)

key字段表示的是 该查询使用的索引。

从访问类型(type)上看都差不多,但是 方案2 中间还有一个 eq_ref 操作,猜测可能会 有一点额外耗时,但是相差不大。其他访问都使用了索引 index0。

2、从extra 来分析
这里再补充下知识点:
useing where: 该查询使用了where 条件
useing index:只使用索引数据,不需要回表查询
useing temporary:使用临时表,如 distinct、order by 等,是一个常见的优化点。

从这点来看的话, 方案1 优于 方案3,因为方案3 使用到了 临时表(useing temporary)

一般还要关注一个指标 rows,表示为了找到满足条件的行,估计需要扫描多少行,这里都一样,就不分析了。

理论上得出的结论是: 方案1 最优,其次是 方案3,最后是 方案2

实际测试

测试环境: win10 + mysql 5.5(mysql 关闭内存)
数据量:item 表 19万, detail表 5450万 数据,company_id = ‘123’ 在两张表中分别是 10 w、5000w 行

分别把 3 条sql 跑 10次,取平均值,结果如下:
方案1: 27ms,
方案2:35ms,
方案3: 31ms
跟explain分析结果基本符合

综上:方案1最优。

案例 参考自博文:https://ask.csdn.net/questions/7651470?weChatOA=

基于explain分析进行SQL优化(实例分析)相关推荐

  1. 崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析

    2013数据库大会:崔华-基于Oracle的SQL优化案例分析 崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待. 2013年中国数据库技术大会第二天的"Oracle ...

  2. 操作系统笔记——Linux系统实例分析、Windows系统实例分析

    文章目录 传送门 Linux进程管理 Linux进程组成 Linux进程链表 Linux进程控制 用户进程创建与撤销 0,1,2号进程 Linux进程切换 Linux进程调度 内核同步 Linux储存 ...

  3. 袋鼠云数栈基于CBO在Spark SQL优化上的探索

    原文链接:袋鼠云数栈基于CBO在Spark SQL优化上的探索 一.Spark SQL CBO选型背景 Spark SQL的优化器有两种优化方式:一种是基于规则的优化方式(Rule-Based Opt ...

  4. 网页设计css分析,基于CSS技术的网页制作实例分析

    21世纪我国科学技术水平大幅提高,计算机网络技术成为了推动各行各业事业发展的助推器,可以利用计算机网络快速发布和获取信息,同样在人们的政治生活.经济生活等多个方面发挥着无可比拟的作用.网页设计与计算机 ...

  5. oracle数据库主机CPU使用率高问题的分析及SQL优化

    服务概述 业务系统ORACLE数据库所在主机在近期遇到CPU使用率高的性能问题,工程师及时响应并协助查找了引起数据库性能问题的SQL:后续对此故障原因进行分析及相关建议,详细的故障情况及相关信息分析及 ...

  6. 基于oracle 11g 的SQL优化

    1.查看当前数据库版本: select* from v$version;(以下示例基于oracle 11.2.0.1.0) 2.ROWID oracle数据库的表中的每一行数据都有一个唯一的标识符,该 ...

  7. python温度转换代码分析_Python温度转换实例分析

    本文主要研究的是Python语言实现温度转换的相关实例,具体如下. 代码如下: #TempConvert.py val=input("请输入带有温度表示符号的温度值(例如:32c)" ...

  8. java实例分析宠物商店_java实例分析:宠物商店.ppt

    JAVA 应用开发详解 面向对象(高级) -- 实例分析:宠物商店 实例要求 实现一个宠物商店,在宠物商店中可以有多种(由用户决定数量)宠物,试表示出此种关系,并要求可以根据宠物的关键字查找到相应的宠 ...

  9. ansys经典界面分析工字钢_ansys工字钢实例分析.doc

    ansys工字钢实例分析.doc ANSYS工字钢分析学院机械工程学院专业材料成型及控制工程班级2013级1班姓名邓祥丰学号201310112101一,定义单元类型1选择MAINMENUPREPROC ...

最新文章

  1. SQL函数Group_concat用法
  2. LTE-V2X车联网无线通信技术发展
  3. python range函数范围_Python range函数
  4. c# python 相互调用_【GhPython】Python如何使用“委托”和lambda表达式
  5. 在spark应用程序中设置输出日志的级别
  6. Anaconda3+Python3.6搭建Tensorflow
  7. 递归的使用不当 导致 压缩文件不能压缩二级目录
  8. 关于vmware虚拟机硬件里没有软盘驱动器,而操作系统里还有的解决方法
  9. kettle oracle数据从库到库,kettle 使用oracle数据库当做资源库
  10. utf-8下编辑的时候字体不能直接识别,但是可以识别 unicode 编码表
  11. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_1_函数式编程思想概述...
  12. 用c语言把蜂鸣器封装成函数,C语言蜂鸣器问题
  13. 电脑截gif动图软件
  14. python 隐含波动率_python - QuantLib XL隐含波动率 - 堆栈内存溢出
  15. UVALive 3713 Astronauts(2-sat+输出任意路径)
  16. 黑猴子的家:JavaWeb 之 CSS
  17. 用摄像管替换电视机电路里的显像管的摄像机
  18. C# dotnet 获取某个字符所在 Unicode 字符平面映射
  19. 抗洪救灾,共克时艰,城联优品捐赠10万元爱心物资驰援英德
  20. 【论文笔记】MV3D:Multi-View 3D Object Detection Network for Autonomous Driving

热门文章

  1. [转]服务器操作系统CoreOS介绍
  2. 网页不能复制文本的解决办法
  3. python计算器小程序源码_python代码编写计算器小程序
  4. 跨境电商ERP中的自动化 1.平台订单自动同步至本地
  5. 2021年电工(初级)考试平台及电工(初级)
  6. 计算机辅助设计的缩写6,6计算机辅助设计的英文缩写是.doc
  7. Tarde破解版使用, 悬赏提问
  8. 哥德尔不完备定理----一切都是非真即假的吗
  9. 基于心理学角度对大班幼儿入园哭闹现象分析
  10. PCB打样需要哪些文件