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相关推荐

  1. mysql 多个left join_mysql多个left join连接查询用法分析

    本文实例讲述了mysql多个left join连接查询用法.分享给大家供大家参考,具体如下: mysql查询时需要连接多个表时,比如查询订单的商品表,需要查询商品的其他信息,其他信息不在订单的商品表, ...

  2. 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 ...

  3. mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】

    第一部分:https://zhuanlan.zhihu.com/p/63217422 第二部分:https://zhuanlan.zhihu.com/p/64153448 Day3 九.连接查询 1. ...

  4. MYSQL的sql笔记之多表联查

    多表联查 在关系型数据库中,表与表之间是联系的,至于是怎么联系的,我们在开发设计表的时候一般会使用物理外键将多张表进行关联.所以在实际应用中,经常使用多表查询.多表查询就是同时查询两个或两个以上的表. ...

  5. MySQL 联合查询实质_1.多表查询 = 转化为一张联合大表 2.可视化工具 3.pymysql模块...

    多表数据 create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); crea ...

  6. mysql 同一张表 某个字段更新到另一条数据上_面试基础:数据库MySQL基础入门(下)...

    本文是面试基础的第二篇.本篇偏理论,包括三节: 事务和并发 数据库设计 索引 所选的三个内容均是面试的高频考察点,需要细致地理解 No.1     事务和并发 事务:数据库操作的基本单元.对于数据库的 ...

  7. mysql数据库访问300ms以上_[Java教程]一张900w的数据表,16s执行的SQL优化到300ms?...

    [Java教程]一张900w的数据表,16s执行的SQL优化到300ms? 0 2020-11-20 16:00:16 一,前言 证实 有一张财务流水表,未分库分表,目前的数据量为9555695,分页 ...

  8. MySQL可以同时修改两个表吗_(10)MySQL触发器(同时操作两张表)

    什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[日志 ...

  9. mysql 多张表公用一个序列_Mysql--序列3--分库分表策略

    分库分表是存储层设计中一个普遍而重大的问题,什么时候分?怎么分?分完之后引发的新问题,比如不能Join.分布式事务? 本篇将从最基本的策略出发,逐步深入讲解这里面涉及的一序列策略. 分库-业务分拆 & ...

  10. mysql 两张表合并查询_mysql中的分区表和合并表详解(一个常见知识点)

    分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...

最新文章

  1. 初次体验hiphop-php
  2. LRNNet:轻量级FCB SVN实时语义分割
  3. NAACL| 基于标签感知的双迁移学习在医学命名实体识别中的应用
  4. CentOS7(64位)安装Jupyter Notebook
  5. UI设计实战篇——利用Bootstrap框架制作查询页面的界面
  6. python抽奖游戏大全_抽奖游戏
  7. WeChat生成授权的token:md5(随机字符串+时间戳+盐值)
  8. 第十章 基本数据结构——链表
  9. STM32学习——EXTI外部中断
  10. 17011301(UE4的AnimDynamic)
  11. 我觉得这个世界不是特别的好,你说呢
  12. html中的坐标从哪里开始,HTML+CSS入门 页面内跳转到相应位置的3种方法
  13. 直流电动机调速matlab,基于MATLAB龙门刨床直流电动机调速系统仿真研究
  14. [案例2-3]超市购物小程序
  15. 20款Adobe AIR小游戏
  16. task04 办公自动化之Python 操作 PDF
  17. 使用awk提取文本 awk处理条件 awk流程控制 awk扩展应用
  18. 在ISE下分析约束时序
  19. windows系统C盘越来越大怎么办(包括win10)
  20. (听说标题越短事越大)

热门文章

  1. 自定义ViewPager和RecyclerView指示器 Indicator
  2. P5.js创意自画像编程
  3. 【coq】函数语言设计 练习题poly 总结
  4. Windows查看电脑ip地址方法(用于连接远程桌面)
  5. 数据库设计(5)-理解用户需求
  6. 程序人生 - 水的TDS值是什么意思?多少才算健康?
  7. 设置共享文件夹在主机与本地VMware虚拟机之间传输文件
  8. 强大的类似qq截图或者微信截图功能软件
  9. HTML中视频的压缩方式,快速将视频压缩到最小的技巧!
  10. linux常用命令大全,建议收藏