基于explain分析进行SQL优化(实例分析)
背景
最近遇到一个问题,实现相同功能的几个 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优化(实例分析)相关推荐
- 崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析
2013数据库大会:崔华-基于Oracle的SQL优化案例分析 崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待. 2013年中国数据库技术大会第二天的"Oracle ...
- 操作系统笔记——Linux系统实例分析、Windows系统实例分析
文章目录 传送门 Linux进程管理 Linux进程组成 Linux进程链表 Linux进程控制 用户进程创建与撤销 0,1,2号进程 Linux进程切换 Linux进程调度 内核同步 Linux储存 ...
- 袋鼠云数栈基于CBO在Spark SQL优化上的探索
原文链接:袋鼠云数栈基于CBO在Spark SQL优化上的探索 一.Spark SQL CBO选型背景 Spark SQL的优化器有两种优化方式:一种是基于规则的优化方式(Rule-Based Opt ...
- 网页设计css分析,基于CSS技术的网页制作实例分析
21世纪我国科学技术水平大幅提高,计算机网络技术成为了推动各行各业事业发展的助推器,可以利用计算机网络快速发布和获取信息,同样在人们的政治生活.经济生活等多个方面发挥着无可比拟的作用.网页设计与计算机 ...
- oracle数据库主机CPU使用率高问题的分析及SQL优化
服务概述 业务系统ORACLE数据库所在主机在近期遇到CPU使用率高的性能问题,工程师及时响应并协助查找了引起数据库性能问题的SQL:后续对此故障原因进行分析及相关建议,详细的故障情况及相关信息分析及 ...
- 基于oracle 11g 的SQL优化
1.查看当前数据库版本: select* from v$version;(以下示例基于oracle 11.2.0.1.0) 2.ROWID oracle数据库的表中的每一行数据都有一个唯一的标识符,该 ...
- python温度转换代码分析_Python温度转换实例分析
本文主要研究的是Python语言实现温度转换的相关实例,具体如下. 代码如下: #TempConvert.py val=input("请输入带有温度表示符号的温度值(例如:32c)" ...
- java实例分析宠物商店_java实例分析:宠物商店.ppt
JAVA 应用开发详解 面向对象(高级) -- 实例分析:宠物商店 实例要求 实现一个宠物商店,在宠物商店中可以有多种(由用户决定数量)宠物,试表示出此种关系,并要求可以根据宠物的关键字查找到相应的宠 ...
- ansys经典界面分析工字钢_ansys工字钢实例分析.doc
ansys工字钢实例分析.doc ANSYS工字钢分析学院机械工程学院专业材料成型及控制工程班级2013级1班姓名邓祥丰学号201310112101一,定义单元类型1选择MAINMENUPREPROC ...
最新文章
- SQL函数Group_concat用法
- LTE-V2X车联网无线通信技术发展
- python range函数范围_Python range函数
- c# python 相互调用_【GhPython】Python如何使用“委托”和lambda表达式
- 在spark应用程序中设置输出日志的级别
- Anaconda3+Python3.6搭建Tensorflow
- 递归的使用不当 导致 压缩文件不能压缩二级目录
- 关于vmware虚拟机硬件里没有软盘驱动器,而操作系统里还有的解决方法
- kettle oracle数据从库到库,kettle 使用oracle数据库当做资源库
- utf-8下编辑的时候字体不能直接识别,但是可以识别 unicode 编码表
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_1_函数式编程思想概述...
- 用c语言把蜂鸣器封装成函数,C语言蜂鸣器问题
- 电脑截gif动图软件
- python 隐含波动率_python - QuantLib XL隐含波动率 - 堆栈内存溢出
- UVALive 3713 Astronauts(2-sat+输出任意路径)
- 黑猴子的家:JavaWeb 之 CSS
- 用摄像管替换电视机电路里的显像管的摄像机
- C# dotnet 获取某个字符所在 Unicode 字符平面映射
- 抗洪救灾,共克时艰,城联优品捐赠10万元爱心物资驰援英德
- 【论文笔记】MV3D:Multi-View 3D Object Detection Network for Autonomous Driving