作者:成金之路

www.cnblogs.com/uttu/p/6384541.html

本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级、千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果)。

希望读者能够理解SQL的执行过程,并根据过程优化,走上自己的"成金之路"

需要优化的查询:

使用explain出现了Using temporary;

有分页时出现了Using filesort则表示使用不了索引,需要根据下面的技巧来调整语句

rows过多,或者几乎是全表的记录数;

key 是 (NULL);

possible_keys 出现过多(待选)索引。

1.使用explain语法,对SQL进行解释,根据其结果进行调优:

MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果:

EXPLAIN 结果中,第一行出现的表就是驱动表

对驱动表可以直接排序,对非驱动表(的字段排序)需要对循环查询的合并结果(临时表)进行排序(Important!),即using temporary;

[驱动表] 的定义为:1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];2)未指定联接条件时,行数少的表为[驱动表](Important!)。

优化的目标是尽可能减少JOIN中Nested Loop的循环次数,以此保证:永远用小结果集驱动大结果集(Important!)!:A JOIN B,A为驱动,A中每一行和B进行循环JOIN,看是否满足条件,所以当A为小结果集时,越快。

NestedLoopJoin实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与Join,则再通过前两个表的Join结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复

2.两表JOIN优化:

a.当无order by条件时,根据实际情况,使用left/right/inner join即可,根据explain优化 ;

b.当有order by条件时,如select * from a inner join b where 1=1 and other condition order by a.col;使用explain解释语句;

如果第一行的驱动表为a,则效率会非常高,无需优化;

否则,因为只能对驱动表字段直接排序的缘故,会出现using temporary,所以此时需要使用STRAIGHT_JOIN明确a为驱动表,来达到使用a.col上index的优化目的;或者使用left join且Where条件中不含b的过滤条件,此时的结果集为a的全集,而STRAIGHT_JOIN为inner join且使用a作为驱动表

3.多表JOIN优化:

a.无order by条件时,根据实际情况,使用left/right/inner join即可,根据explain优化;

b.有order by a.col条件时,所有join必须为left join,且每个join字段都创建索引,同时where条件中只能有a表的条件,即将其它表的数据关联到a中形成一张大表,再对a的全集进行过滤;

如果不能全使用left join,则需灵活使用STRAIGHT_JOIN及其它技巧,以时间排序为例:

1)数据入库按照平台时间入库,自然a的数据都按时间有序;

SELECT    c.*, r.HYPERVISOR_HOST_NAME hostname,    r.HOST_IPFROM    trust_monitor c STRAIGHT_JOIN res_node r ON c.res_node_id = r.ID STRAIGHT_JOIN am_assets a ON r.ASSET_ID = a.IDAND a. STATUS = 58 STRAIGHT_JOIN se_role s ON a.DEPT_FLAG = s.ROLE_ORGAND s.ROLE_ID IN (32, 33, 36, 41)WHERE    c. STATUS = 58AND c.changed_type = 79LIMIT 1, 10;

SELECT    c.*, r.HYPERVISOR_HOST_NAME hostname,    r.HOST_IPFROM    trust_monitor cINNER JOIN res_node r ON c.res_node_id = r.IDINNER JOIN am_assets a ON r.ASSET_ID = a.IDAND a. STATUS = 58INNER JOIN se_role s ON a.DEPT_FLAG = s.ROLE_ORGAND s.ROLE_ID IN (32, 33, 36, 41)WHERE    c. STATUS = 58AND c.changed_type = 79ORDER BY    c.changed_timeLIMIT 1, 10;

两者结果一致

4.误区:

a.视图只是屏蔽或者高效集合多表数据的一种方法,视图与表JOIN,不会起到任何效果

参考:

http://www.cnblogs.com/zhengyun_ustc/p/slowquery1.htmlhttp://huoding.com/2013/06/04/261

END

Java面试题专栏

我知道你 “在看”

mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优相关推荐

  1. MySQL百万级/千万级数据存储解决方案

    MySQL 百万级/千万级数据存储解决方案 百万级.千万级数据处理,个人认为核心关键在于数据存储方案设计,存储方案设计的是否合理,直接影响到数据CRUD操作.总体设计可以考虑一下三个方面进行设计考虑: ...

  2. Mysql实现文章查询上一篇和下一篇功能,附sql语句?

    mysql实现文章查询上一篇和下一篇功能,附sql语句? 最近在做一个项目用到的文章查询上一篇和下一篇功能,详见:http://www.yifen5.com Mysql实现文章查询上一篇和下一篇功能, ...

  3. MySQL百万级、千万级数据多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 希望读者能够理解 ...

  4. mysql百万数据join_MySQL百万级、千万级数据多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 希望读者能够理解 ...

  5. mysql 主键 sql语句_Mysql 增加主键或者修改主键的sql语句操作

    添加表字段 alter table table1 add transactor varchar(10) not null; alter table table1 add id int unsigned ...

  6. mysql导入100000000需要多久_MYSQL批量插入千万级数据只需百秒

    1.首先建立一张student表函数 create table(id int(20) NOT NULL AUTO_INCREMENT,sex char(1),name varchar(20));spa ...

  7. SQL数据库不用SQL语句能显示全表的内容_MySQL百万级数据库优化方案

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  8. mysql查询主键sql语句_MySQL数据库-表操作-SQL语句(一)

    1. 数据库操作与存储引擎 1.1   数据库和数据库对象 数据库对象:存储,管理和使用数据的不同结构形式,如:表.视图.存储过程.函数.触发器.事件等. 数据库:存储数据库对象的容器. 数据库分两种 ...

  9. MySQL 百万级/千万级表 全量更新

    业务需求:今天从生成测试环境迁移了一批百万级/千万级表的数据,领导要求将这批数据进行脱敏处理(将真实姓名 .电话.邮箱.身份证号等敏感信息进行替换).迁移数据记录数如下(小于百万级的全量更新不是本文重 ...

最新文章

  1. SAP Spartacus可供demo用途的Commerce Cloud public instance
  2. midl会议_2020年医学图像处理领域值得关注的期刊和会议
  3. 构造方法注入和设值注入有什么区别
  4. 01-windows下python爬取网页上的图片
  5. mysql数据库容量为多少GB_MySQL数据库单表容量有多少 MySQL数据库使用教程
  6. 马化腾谈滴滴;苹果供应商研发柔性玻璃;丁磊谈沉迷手机 | 极客头条
  7. 绘制图像直方图 matplotlib
  8. C++语言虚函数表实现多态原理
  9. 最简单的正交试验教程
  10. debian 文件夹中文件大小_linux 查看文件和文件夹大小
  11. apple id 如何注册来啦?(亲测流程)
  12. JavaCV图片和视频互转 视频添加文字
  13. openwrt 格式化_如何在路由器上格式化 U 盘、硬盘
  14. c语言函数大全 chm,c语言常用函数手册 chm格式.doc
  15. 晶闸管整流桥matlab仿真,matlab仿真模型作业
  16. ssm+java计算机毕业设计公交路线查询系统l1auz(程序+lw+源码+远程部署)
  17. 游戏开发中2D场景下实现伪3D碰撞检测方法
  18. CSS3动画效果-animate.css
  19. Java实现上传(支持多个文件同时上传)和下载
  20. (转载)技术族谱:软件开发相关知识体系的整理心得(图)

热门文章

  1. java 单例写法_java 单例模式的几种写法
  2. linux tomcat 安装教程,关于Linux下配置安装Tomcat8的步骤
  3. winxp 连接linux ftp,Linux和XP之间使用FTP互传文件
  4. 【c语言】蓝桥杯算法提高 一元一次方程
  5. 隐私全无!错发1700多条Alexa录音,上报后亚马逊淡定回应是“个人错误”
  6. 追溯了解Ubuntu之------基本命令操作(叁)
  7. 组织会议中的“小心思”
  8. 运行第一个Docker容器-Docker for Web Developers(1)
  9. master线程的主循环,后台循环,刷新循环,暂停循环
  10. java通过JDBC链接SQLServer2012