mysql俩个表之间关联语法_MySQL多表关联SQL语句调优

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

需要优化的查询:使用explain

出现了Using temporary;

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

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

key 是 (NULL);

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

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

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

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

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

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

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

e.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解释语句;

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

2)否则,因为只能对驱动表字段直接排序的缘故,会出现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_IP FROM 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.ID AND a.status = 58 STRAIGHT_JOINse_role s ON a.DEPT_FLAG = s.ROLE_ORG AND s.ROLE_ID IN (32,33,36,41) where c.STATUS = 58 and c.changed_type = 79 limit 1,10;

SELECT c.*, r.HYPERVISOR_HOST_NAME hostname, r.HOST_IP FROM trust_monitor c inner JOIN res_node r ON c.res_node_id = r.ID INNER JOIN am_assets a ON r.ASSET_ID = a.ID AND a.status = 58 INNER JOIN se_role s ON a.DEPT_FLAG = s.ROLE_ORG AND s.ROLE_ID IN (32,33,36,41) where c.STATUS = 58 and c.changed_type = 79 order by c.changed_time limit 1,10;

两者结果一致

4.误区:

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

参考:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设置计算机http端口号,服务器http端口设置

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率三年低至5折,多种配置可选了解详情修改弹性公…

dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用

点击上方“匠心零度”,选择“设为星标”做积极的人,而不是积极废人作者:SimpleWucnblogs.com/SimpleWu/p/10833555.htmlSpringBoot 和 Dubbo 又能碰撞出什么火花呢?我们来看看企业级 SpringBoot 与 Dubbo 的并用。版本:Springboot…

心理学博士vs计算机博士,零基础跨专业考心理学博士,可以给我一些建议吗?...

5星优质答主关注有用62020-12-19回答了:关于跨专业考心理学博士的问题,我曾经也有探索过,说一些我的经历,希望能给你带来一些些帮助。我知道的跨专业考心理学博士最知名的例子就是岳晓东教授,他的经历你可以参考一下&a…

智能云媒体服务器,智慧广电媒体解决方案

随着4K超高清视频技术飞速发展,电视台需实现播出内容的全面升级,以适应4K时代的新需求。非线性编辑作为电视台不可缺少的节目生产工具,目前正在向云化非编方式演进,并且需要满足4K节目的制作标准,这对于电视台传统IT架…

mysql2800_mysql error 1045 (2800):。。 'root'@'localhost' (using password:YES)

用rpm的方法把mysql已经安装完成,可是遇到一个登录问题mysql 或者mysql -uroot都能够直接登录到mysql数据库里面。但是加了参数p以后登录报错 mysql -uroot -p 或者 mysql -uroot -prootmysql error 1045 (2800):access denied for user rootlocalhost (using passw…

在react项目中编写css,更好的在react项目中写css代码--emotion

简介:emotion是一个JavaScript库,使用emotion可以用写js的方式写css代码。在react中安装emotion后,可以很方便进行css的封装,复用。使用emotion后,浏览器渲染出来的标签是会加上一个css开头的标识。如下:截…

mysql 5.7 差异备份_MySQL 5.7 新备份工具mysqlpump 使用说明 - 运维小结

之前详细介绍了Mysqldump备份工具使用,下面说下MySQL5.7之后新添加的备份工具mysqlpump。mysqlpump是mysqldump的一个衍生,mysqldump备份功能这里就不多说了,现在看看mysqlpump到底有了哪些提升,详细可以查看官网文档。mysqlpump和…

腾达路由器dns服务器未响应,腾达路由器的设置方法

腾达路由器的设置方法许多刚买了tenda路由器的新手朋友们,还不知道腾达tenda路由器的设置方法,下面将通过图文并茂的方式,为你详细的介绍tenda路由器的具体设置步骤,希望能够帮助到你!步骤一:连接好线路电话线入户的用…

mysql8审计_审计对存储在MySQL 8.0中的分类数据的更改

作者:Mike Frank 译:徐轶韬面临的挑战使用敏感信息时您需要拥有审计日志。通常,此类数据将包含一个分类级别作为行的一部分,定义如何处理、审计等策略。在之前的博客中,我讨论了如何审计分类数据查询。本篇将介绍如何…

微信小程序读取服务器多个数组,微信小程序多层嵌套循环,二级数组遍历

小程序中的遍历循环类似于angularJS的遍历。二级数组遍历有一个坑。二级遍历wx:for循环的时候,需要注意。(代码如下)JS代码:data: {groups: [[{title: 狼图腾,cover: ../../img/mineBG.png},{title: 狼图腾,cover: ../../img/mineBG.png},],[…

mysql workbench 1064_MySQL Workbench:查询错误(1064):第1行“ VISIBLE”附近的语?mysql-问答-阿里云开发者社区-阿里云...

这里的问题是不同MySQL服务器版本之间的语法差异。看来MySQL Workbench 8.0.12是CREATE UNIQUE INDEXMySQL服务器版本8.0的自动生成语句。在MySQL Server 8.0文档中,其语法为CREATE INDEX:CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name [index…

辐射避难所买了东西显示服务器异常,《辐射:避难所》常见问题汇总

Q:如何啪啪啪?A:首先需要一个起居室(LIVINGQUARTERS),规模等级随意,至少有一名成年男性与女性.其次之间不能有血缘关系.然后男女之间会相互对话聊天,注意看对话,如果出现nothing … with family…等字眼就是说明有血缘关系,否则一定时间后他们就会一起跳舞,再然后就是啪啪啪了…

mysql订单详情的设计_订单功能模块设计与实现

在商城项目中,之前我们介绍了购物车功能模块的实现,商品加入到购物车之后,就是到购物车结算,然后显示购物车的商品列表,点击去结算,然后到了未提交前的订单列表,点击提交订单后,生成…

mysql放开权限控制_mysql06---权限控制-阿里云开发者社区

mysql权限管理:mysql的权限控制,首先在user表判断有没有权限连,连上后看有没有全局权限。然后看db表有哪些库级别的权限。然后看tables_priv表有哪些表级别的权限。最后还可以看有哪些列级别的权限。mysql权限检查:1.有没有权连接…

mysql php释放内存_php mysqli_free_result()函数释放结果集

mysqli_free_result()介绍php mysqli_free_result()函数用于释放查询出来的数据结果集,这样有利于及时清理内存。语法:mysqli_free_result(result);参数:参数描述result必需。数据结果集(由mysqli_query()所返回)mysqli_free_result()实例1、…

mysql乱码问题_mysql乱码问题

mysql乱码问题出现乱码的原因:因为当前的CMD客户端窗口与数据库本身及库,表的编码格式不一致导致的。所以当出现乱码的时候,请排查:* sql文件的编码格式* 当前CMD客户端窗口的编码格式* 数据库服务本身的编码格式* 数据库的编码格…

mysql的纵向扩展方案_SQL Server横向扩展方案-SODA

SQL Server横向扩展方案-SODA每次在提到SQL Server扩展性问题的时候,似乎很多的SQL Server DBA或者使用微软技术开发的朋友心里总是一整痛:SQL Server只能纵向的扩展(Scaling-Up),无法横向的扩展(Scaling-Out)。每次有人提到Oracle和SQL Serv…

python的功能名称_ML获取功能选择后的功能名称SelectPercentile,python

我已经为这件事挣扎了一段时间了。我的目标是获取一个文本特征,并从中找出5-10个最好的单词来帮助我分类。因此,我正在运行一个TfIdfVectorizer,现在选择~90最佳。然而,当我缩小了特性数量之后,我无法看到实际选择了哪…

python编程竞赛规则_用python实行羽毛球比赛规则。

羽毛球比赛规则:1、21分制,三局两胜为佳2、每球得分制3、每回合中取胜的一方的一分4、双方均为20分时,领先对方2分一方获胜5、双方均为29分时,先到达30分一方获胜6、一局比赛中获胜方在下一局率先开球代码如下:from ra…

使用python下载文件的简单示例_Python

简单的FTP下载 ,不加任何异常判断。import osfrom ftplib import FTPftp_addr 10.10.0.1fFTP(ftp_addr)f.login(anonymous)f.cwd("apk_download/")remote_file 20141223140651.apkf.retrbinary("RETR %s" % remote_file, open(remote_file, &…