mysql多张表join_mysql多表联查join优化之 straight_join
Mysql多表联合查询:
首先搞清楚一个概念:笛卡尔积,驱动表
关于笛卡尔积:
简言之就是强拼,不带条件的硬拼2(多)张表,结果就是直接做乘法
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b;
SELECT * FROM a,b;
SELECT * FROM a NATURE JOIN b;
SELECT * FROM a NATURA join b;
例子:SELECT * FROM a LEFT JOIN b;
关于驱动表:
如何判断驱动表
如果没有where条件
左连接,如果没有where条件,则左表为驱动表
右连接,如果没有where条件,右表为驱动表
explain规则:explain语句结果中,第一行为驱动表(该定律适用于join;子查询的话要分情况)
性能优化相关
①选谁做驱动表
引用一个举烂了的例子,在没有过滤条件的情况下,外表有多少行就会被加载多少次;
参考《索引设计与优化》这本书的说法,每次加载相当于一次随机读;
假设A表10000行,B表100行;也就是说如果用A表做驱动表会伴随着10000次随机读,而如果是B表作为驱动表,会伴随着100次随机读。
所以普遍的优化方案是小表作为外表(驱动表),用小表去驱动大表。
②创建合理的索引
选择小表驱动大表,然后在内表(被驱动的大表)的连接谓词上建立索引,使得对内表的查询走索引提高效率。这种做法最高效的就是外表是一张小表,而内表的连接谓词刚好是内表的主键。
在对这种没有查询过滤条件的语句执行explain的时候会非常不爽,因为驱动表通常是走的全表扫描;在我的测试中,如果外表上没有查询过滤条件(也就是本地谓词)的话,无论查询项是否是索引项,都是走全表。(换句话说,也就是在没有过滤条件的情况下,外表其实有没有索引对于当前语句的优化意义都不太明显(因为会走全表嘛),如果专门因为某个语句去对外表建一大堆索引的可以省省了)
使用EXPLIAN字段可以对sql语句进行分析,当extra有Using temporary; Using filesort等时表示需要进行优化,意思分别是用了临时表和一种sql的排序。
eg1:
select * from a inner join b where a.id=b.aid order by a.id;这种情况下:
如果a的集合比b小,那么mysql就会以a为驱动表,这个时候如果a.id有索引的话,那么这个索引是起效的,不会出现Using temporary; Using filesort,查询是高效的。
如果a的集合比b大,那么mysql就会以b为驱动表,这个时候如果a.id有索引的话,那么这个索引是不起效的,order by只能对驱动表进行排序,此时可能会出现Using temporary; Using filesort,在数据量很大的情况下查询非常慢。
解决:
人为的对表进行设置哪个为驱动表,如left join,或者straight_join(强制把左边的表设置为驱动表),然后把order by 字段,加一个索引。
实际问题:
项目中遇到一个页面要20s才加载好,找到sql语句,发现做了2个查询,一个是查询信息,花费10s,另外一个是select count所以时间等同10s,用explian分析:es是主表有15w条记录,sp表只有14条记录,所以使用inner join的话mysql会自动优化为以sp为驱动表,因为如果以sp表为驱动表(排第一个的就是驱动表),那么只需循环14次去匹配15w的es表是比较高校的,但是这里需要对es表中的modifytime进行排序,所以先搜全部符合条件,再对其进行排序,而且不能用索引,所以就会Using temporary; Using filesort,而且特别慢。
措施:
改为straight_join,或者left join
此时,查询速度已经快了很多,但是使用分析,还是有Using temporary; Using filesort,所以对order by的字段添加索引,这时就能做到最好优化此时,explian全部为using where。大功告成
mysql多张表join_mysql多表联查join优化之 straight_join相关推荐
- mysql 多个left join_mysql多个left join连接查询用法分析
本文实例讲述了mysql多个left join连接查询用法.分享给大家供大家参考,具体如下: mysql查询时需要连接多个表时,比如查询订单的商品表,需要查询商品的其他信息,其他信息不在订单的商品表, ...
- mysql semi join_MySQL 5.6 Semi join优化之materialization strategy
8月 24, 2014 | Nix.Huang 考虑如下查询: select * from Country where Country.code IN (select City.Country fro ...
- mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】
第一部分:https://zhuanlan.zhihu.com/p/63217422 第二部分:https://zhuanlan.zhihu.com/p/64153448 Day3 九.连接查询 1. ...
- MYSQL的sql笔记之多表联查
多表联查 在关系型数据库中,表与表之间是联系的,至于是怎么联系的,我们在开发设计表的时候一般会使用物理外键将多张表进行关联.所以在实际应用中,经常使用多表查询.多表查询就是同时查询两个或两个以上的表. ...
- MySQL 联合查询实质_1.多表查询 = 转化为一张联合大表 2.可视化工具 3.pymysql模块...
多表数据 create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); crea ...
- mysql 同一张表 某个字段更新到另一条数据上_面试基础:数据库MySQL基础入门(下)...
本文是面试基础的第二篇.本篇偏理论,包括三节: 事务和并发 数据库设计 索引 所选的三个内容均是面试的高频考察点,需要细致地理解 No.1 事务和并发 事务:数据库操作的基本单元.对于数据库的 ...
- mysql数据库访问300ms以上_[Java教程]一张900w的数据表,16s执行的SQL优化到300ms?...
[Java教程]一张900w的数据表,16s执行的SQL优化到300ms? 0 2020-11-20 16:00:16 一,前言 证实 有一张财务流水表,未分库分表,目前的数据量为9555695,分页 ...
- MySQL可以同时修改两个表吗_(10)MySQL触发器(同时操作两张表)
什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[日志 ...
- mysql 多张表公用一个序列_Mysql--序列3--分库分表策略
分库分表是存储层设计中一个普遍而重大的问题,什么时候分?怎么分?分完之后引发的新问题,比如不能Join.分布式事务? 本篇将从最基本的策略出发,逐步深入讲解这里面涉及的一序列策略. 分库-业务分拆 & ...
- mysql 两张表合并查询_mysql中的分区表和合并表详解(一个常见知识点)
分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...
最新文章
- 初次体验hiphop-php
- LRNNet:轻量级FCB SVN实时语义分割
- NAACL| 基于标签感知的双迁移学习在医学命名实体识别中的应用
- CentOS7(64位)安装Jupyter Notebook
- UI设计实战篇——利用Bootstrap框架制作查询页面的界面
- python抽奖游戏大全_抽奖游戏
- WeChat生成授权的token:md5(随机字符串+时间戳+盐值)
- 第十章 基本数据结构——链表
- STM32学习——EXTI外部中断
- 17011301(UE4的AnimDynamic)
- 我觉得这个世界不是特别的好,你说呢
- html中的坐标从哪里开始,HTML+CSS入门 页面内跳转到相应位置的3种方法
- 直流电动机调速matlab,基于MATLAB龙门刨床直流电动机调速系统仿真研究
- [案例2-3]超市购物小程序
- 20款Adobe AIR小游戏
- task04 办公自动化之Python 操作 PDF
- 使用awk提取文本 awk处理条件 awk流程控制 awk扩展应用
- 在ISE下分析约束时序
- windows系统C盘越来越大怎么办(包括win10)
- (听说标题越短事越大)