mysql索引优化 - 多表关联查询优化

news/2024/9/20 11:12:45
1 left join
EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card;
LEFT JOIN条件用于确定如何从右表搜索行, 左边一定都有,
#所以右边是我们的关键点,一定需要建立索引


结论:在优化关联查询时,只有在被驱动表上建立索引才有效! 
         
left join 时,左侧的为驱动表,右侧为被驱动表

2 right join
条件用于确定如何从左表搜索行, 右边一定都有
EXPLAIN SELECT*FROM class RIGHT JOIN book ON class.card=book.card;
所以左边是我们的关键点,一定需要建立索引

3 inner join 时
mysql 会自己帮你把小结果集的表选为驱动表。 
但是会强制将左侧作为驱动表!

记住:永远用小的结果集驱动大的结果集

4 多表关联时
EXPLAIN SELECT ed.name '人物',c.name '掌门' FROM (SELECT e.name,d.ceo from t_emp e LEFT JOIN t_dept d on e.deptid=d.id) ed LEFT JOIN t_emp c on ed.ceo= c.id;(较好


EXPLAIN SELECT e.name '人物',tmp.name '掌门' FROM t_emp e LEFT JOIN (SELECT d.id did,e.name FROM t_dept d LEFT JOIN t_emp e ON d.ceo=e.id)tmp ON e.deptId=tmp.did;

上述两个案例,第一个查询效率较高,且有优化的余地
第二个案例中,子查询作为被驱动表,由于子查询是虚表, 无法建立索引,因此不能优化。

结论子查询尽量不要放在被驱动表,有可能使用不到索引; 
          left join时,尽量让实体表作为被驱动表。


能够直接多表关联的尽量直接关联,不用子查询!
 

https://dhexx.cn/news/show-17241.html

相关文章

redis使用心得

redis使用心得 原创文章转载请注明出处:协思, http://zeeman.cnblogs.comredis是继memcached之后兴起的内存数据库,作者非常崇尚简洁高效,力求以最简单的方式最高效的解决问题,所谓大道至简。同时作者也很勤奋,经常尝试…

CentOS安装KDE

http://landoflinux.com/linux_install_centos_64.html 转载于:https://www.cnblogs.com/LubinLew/p/CentOS-InstallKDE.html

mysql索引优化 - 子查询优化

结论: 在范围判断时,尽量不要使用 not in 和 not exists,使用 left join on xxx is null 代替。 取所有不为掌门人的员工,按年龄分组! select age as 年龄, count(*) as 人数 from t_emp where id not in (select ceo…

树莓派折腾---红外探测

先上个图: 用到的配件: 1.主角:树莓派 2.配角:红外探测 3.打杂:面包板,杜邦线,蜂鸣器,LED,电阻 红外探测有三个针脚,两端的是供电,中间是信号输出…

C++ 文件操作学习

fstream 可以对文本进行 读和写的操作ostream 只能对文本进行 写istream 只能对文本进行 读先来 了解一下 流 类库的成员函数 put(char c) 输出一个字符 write(const char * str,int n) 输出一条字符串get(char c) 获取一个字符getline(char *buf,int n,char deline\n) 读取一…

mysql索引优化 - 排序分组优化

where 条件和 on 的判断这些过滤条件,作为优先优化的部分,是要被先考虑的! 其次,如果有分组和排序,那么 也要考虑 grouo by 和 order by。1. 必须有过滤,才会用到索引 结论:where,li…

Http协议

Http 简介 Http 超文本传输协议,一种详细规定了浏览器和万维网服务器或自荐的互相通信的规则,它寻将HTML文档从WEB服务器传输到WEB浏览器 client 发出 Request 给servers servers 给一个 Response 给clientHttp Request: 包括 请求行、请求头…

.Net学习笔记----2015-07-09(基础复习和练习06)

冒泡排序, 做了两遍 // 1, 3, 4, 2, 6, 8, 7, 9, 0, 5//10个元素,从第一个开始,和数组中的每一个元素比较,//如果nums[0]>nums[1]则两个元素交换位置,依次类推直到nums[9]//也就是要比较9次//剩余1个元素就一定是最…

MQTTX与阿里云IOT平台交互,发布订阅消息,以及将设备属性发送到云平台

1 新建产品和设备,添加物模型的属性 其中产品部分需要注意的(不这样,也可以,只是个Demo,太复杂了,你会晕的) 所属品类:自定义品类 节点类型:直连设备 2 打开设备,复制 三元组 ProductKey,DeviceName,Devi…

Objective-c中 isEqual ,isEqualToString , == 三者的区别

首先 OC中的对象都是用指针表示,方法的调用是基于消息机制实现, 比较的自然是指针指向的地址 然后 说下 isEqual 和 isEqualToString 的区别 IsEqual 是 NSObject 的方法 ,而 isEqualToString 是 NSString 的方法 因此从继承关系角度来说isEq…