[慢查优化]联表查询注意谁是驱动表 你搞不清楚谁join谁更好时请放手让mysql自行判定...
写在前面的话:
不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程;
不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小;
但把mysql客户端(如SQLyog,如HeidiSQL)放在桌面上,时不时拿出来 explain 一把,这是一种美德!
在实例讲解之前,我们先回顾一下联表查询的基础知识。
——联表查询的基础知识——
引子:为什么第一个查询using temporary,第二个查询不用临时表呢?
下面两个查询,它们只差了一个order by,效果却迥然不同。
第一个查询:
EXPLAIN extended
SELECT ads.id
FROM ads, city
WHERE
city.city_id = 8005
AND ads.status = 'online'
AND city.ads_id=ads.id
ORDER BY ads.id desc
执行计划为:
id select_type table type possible_keys key key_len ref rows filtered Extra
------ ----------- ------ ------ -------------- ------- ------- -------------------- ------ -------- -------------------------------
1 SIMPLE city ref ads_id,city_id city_id 4 const 2838 100.00 Using temporary; Using filesort
1 SIMPLE ads eq_ref PRIMARY PRIMARY 4 city.ads_id 1 100.00 Using where
第二个查询:
EXPLAIN extended
SELECT ads.id
FROM ads,city
WHERE
city.city_id =8005
AND ads.status = 'online'
AND city.ads_id=ads.id
ORDER BY city.ads_id desc
------ ----------- ------ ------ -------------- ------- ------- -------------------- ------ -------- ---------------------------
1 SIMPLE city ref ads_id,city_id city_id 4 const 2838 100.00 Using where; Using filesort
1 SIMPLE ads eq_ref PRIMARY PRIMARY 4 city.ads_id 1 100.00 Using where
1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];
2)未指定联接条件时,行数少的表为[驱动表](Important!)。
永远用小结果集驱动大结果集(Important!)!
——实例讲解——
explainSELECT mb.id, ……FROMmb LEFT JOIN mbei ON mb.id=mbei.mb_id INNER JOINu ON mb.uid=u.uidWHERE 1=1ORDER BY mbei.apply_time DESClimit 0,10
------ ----------- ------ ------ -------------- -------------- ------- ------------------- ------- --------------------------------------------
1 SIMPLE mb index userid userid 4 (NULL) 6060455 Using index; Using temporary; Using filesort
1 SIMPLE mbei eq_ref mb_id mb_id 4 mb.id 1
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
explainSELECT mb.id……FROM mb JOIN mbei ON mb.id=mbei.mb_id INNER JOINu ON mb.uid=u.uidWHERE 1=1ORDER BY mbei.apply_time DESClimit 0,10
------ ----------- ------ ------ -------------- ------- ------- ---------------------------- ------ --------------
1 SIMPLE mbei ALL mb_id (NULL) (NULL) (NULL) 13383 Using filesort
1 SIMPLE mb eq_ref PRIMARY,userid PRIMARY 4 mbei.mb_id 1
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
优化第一步之分支1:根据驱动表的字段排序,好吗?
explainSELECT mb.id……FROM mb LEFT JOIN mbei ON mb.id=mbei.mb_id INNER JOINu ON mb.uid=u.uidWHERE 1=1ORDER BY mb.id DESClimit 0,10
------ ----------- ------ ------ -------------- -------------- ------- ------------------- ------ -----------
1 SIMPLE mb index userid PRIMARY 4 (NULL) 10
1 SIMPLE mbei eq_ref mb_id mb_id 4 mb.id 1 Using index
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
优化第二步:去除所有JOIN,让MySQL自行决定!
explainSELECT mb.id……FROM mb,mbei,u
WHERE
mb.id=mbei.mb_id
and mb.uid=u.user_id
order by mbei.apply_time desc
limit 0,10
立竿见影,驱动表一样是小表 mbei:
------ ----------- ------ ------ -------------- ------- ------- ---------------------------- ------ --------------
1 SIMPLE mbei ALL mb_id (NULL) (NULL) (NULL) 13388 Using filesort
1 SIMPLE mb eq_ref PRIMARY,userid PRIMARY 4 mbei.mb_id 1
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
最后的总结:
不要过于相信你的运气!不要相信你的开发环境里SQL的执行速度!请拿起 explain 武器,如果你看到以下现象,请优化:
- 出现了Using temporary;
- rows过多,或者几乎是全表的记录数;
- key 是 (NULL);
- possible_keys 出现过多(待选)索引。
记住,explain 是一种美德!
![](http://ww3.sinaimg.cn/bmiddle/97f224aagw1e8fffdvbtkg20b404qu0x.gif)
转载于:https://www.cnblogs.com/zhengyun_ustc/p/slowquery1.html
[慢查优化]联表查询注意谁是驱动表 你搞不清楚谁join谁更好时请放手让mysql自行判定...相关推荐
- 【explain】MySQL联表查询中的驱动表
写在前面 1.不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程 2.不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小 3 ...
- 将联表查询简化为单表查询案例
目录 1.将联表查询简化为单表查询案例 1.1 问题描述 1.2 优化过程 1.2.1 将联表查询修改为单表查询 1.2.2 利用覆盖索引避免回表 1.将联表查询简化为单表查询案例 1.1 问题描述 ...
- SQL语句多表查询:【多表连查】和【子查询】
SQL语句多表查询:[多表连查]和[子查询] 说明:insert.update.delete只针对[一张表]执行操作. 说明:select可以查询一张表.也可以查询多张表. 说明:多表查询分为:[多表 ...
- 【MySQL】多表查询策略(多表联查子查询)
目录 一.MySQL多表查询 二.准备工作 1.运行环境 2.创建公司表 3.创建员工表 三.多表查询 (一)多表联查-同时查询多张表 1.联结 2.左连接 3.右连接 4.右连接 (二)子查询 1. ...
- 面向考试数据库—单表查询(包含建表数据)
面向考试数据库-单表查询(包含建表数据) 引言 ● 建立练习数据库(之后习题亦是基于该库) 建表源码 单表查询知识点汇总 单表查询练习题32道 (1)选取表中的若干列 (2)选择表中若干元祖 (3)o ...
- php 多表查询输出,ThinkPHP多表查询
ThinkPHP多表查询处理 ThinkPHP多表连接查询处理 ThinkPHP关联查询(多表查询) 网上找到三种方法:table().join().原生SQL语句查询.(以下三种方法输出结果一致,并 ...
- VLOOKUP函数制作多表查询(学生信息表/员工工资表)
VLOOKUP函数制作多表查询(学生信息表/员工工资表) 一.vlookup函数定义 VLOOKUP函数是Excel中的一个纵向查找函数,在工作中都有广泛应用,例如可以用来核对数据,多个表格之间快速导 ...
- mysql 大表查询慢_mysql大表查询慢怎么优化?
mysql大表查询慢的优化方法:1.合理建立索引,通常查询利用到索引比不用索引更快:2.对关键字段建立水平分区,比如时间字段,若查询条件往往通过时间范围来进行查询,能提升不少性能:3.建立粗粒度数据表 ...
- mysql教程多表查询_mysql重点,表查询操作和多表查询
表单查询 1. 完整的查询语句语法 select distinct(* or 字段名 or 四则运算 )from 表名 where 条件 group by 条件 having 条件 order by ...
最新文章
- 关于C语言中的数组指针、指针数组以及二级指针
- 谷歌知名前 AI 研究员无辜被裁,CEO:调查!
- 水晶报表各版本打包模块及相关文档
- 百度NLP、视频搜索团队招聘算法实习生!
- centos php 版本升级 至5.3 wordpress3.7
- python-循环控制-break
- Flash捕神--swf seeker 下载试用版
- 计算机考试的话语,鼓励别人考试的句子
- ubuntu下QQ无法登录解决。
- 天猫魔盘在 deepin-linux中的使用
- java NEW一个对象之后加入大括号
- 空间解析几何 | 经典例题、李林880例题
- Java到底能做什么事情呢?
- 坚果云云盘告诉你如何保护自己的文件不被泄露?
- Adjust接入注意事项
- 百度地图 控件——路网地图和影像地图切换
- js html游戏仿写,天猫首页天猫超市下的选项卡(加自动轮播效果)仿写(js加jquery实现动态效果)...
- vue 使用three.js 实现3D渲染
- 舒老师AK的hu测 T1. 迷失沃尔玛(dp+贪心)
- SQL查询结果加序列号
热门文章
- Mono for Android 篇二 使用Spinner 实现下拉列表读取Browser.BookmarksUri
- 关于erlang的套接字编程
- 用gdb调试nasm汇编程序
- Phinecos(洞庭散人) 专注于开源技术的研究与应用 TinyXML:一个优秀的C++ XML解析器
- C++程序内存泄漏都与哪些方面有关,该如何处理和避免
- java 多表格处理工具,表单工具十一大标准
- mysql自增id用完了_MySQL表自增id用完了该怎么办?
- java获取系统当前时间格式化_java 获取系统当前时间并格式化
- BurpSuite v2021.8.2安装使用
- JDBC【介绍JDBC、使用JDBC连接数据库、简单的工具类】