MySQL Left Join(左连接) 耗时严重的问题

作者&投稿:丙苏 (若有异议请与网页底部的电邮联系)
~

现象:列表页因超时查不出来东西,使用postman模拟请花费40多秒,将sql语句单独提出来后查询速度非常慢,40多秒
先上结论:
在两个表关联字段上建立索引解决此问题,下面的内容比这句话爽多了,请继续看
表结构如下:
users(用户)表:id,name
integal_record(分数记录)表:id,user_id,integal_id
其中,integal_record表的user_id关联着users表的id,业务目的是查询每个员工阅读次数、评论次数和积分总和,查询语句如下:
(里面写死的值是我从mybatis里扣出来的)
integral_id=1代表着阅读,integral_id=2代表着评论

查询时间快半分钟是无法让人接受的,从表象的SQL语句来说,首先我们看到有很多SUM函数,因此我们来测试下SUM函数的计算时间,如下查询每个人阅读的累计次数:

可以看出来计算时间很长和SUM函数没什么关系,再看整个SQL除了一些SUM函数外就剩下users表左联integal_record表,我们把条件去掉,直接就写个左查询试试

amazing,我的users表里有13400条数据,关联的integral_record 表里也有13000条数据,仅仅做了左连接竟然花费了70秒,这肯定是超时的元凶;所以我们explain一下,看看mysql对这条数据的查询策略:

查看结果:

我们看到type字段的结果是All,也就是代表全表扫描,那么就好办了,建立索引即可,其中users表中的id属于主键,策略自增,有默认的索引,不在考虑范围内,我们仅需对integral_record表增加索引即可:

继续执行左联语句查看运行时间:

时间仍然很久,索引并没有起作用,这里排除一些逃避困难时的迷信想法:mysql有bug 或者navicat有bug,有网络问题 哈哈哈.....我们来看左联的关键属性:

执行时间从60多秒变成了0.375s,整个世界都安静了,再次explain一下

发现mtemp(integal)表的检索方式从all变成了ref,索引,快的一批,深呼吸....

希望继续遇到这种sql需要优化的问题来增加sql调优相关经验




繁昌县18353326095: mysql left join和 join的区别 -
政温美利: left join 左连接查询,左边表的数据全部取出,右边的表有了就取出来,没有就空;inner join 只取出左边和右边表都有的数据

繁昌县18353326095: mysql中,多个left join 是怎样的搜寻方式.有一个left join的我明白了,当有多个left join时,是什么意思 -
政温美利: 比如 a表 b表id name name fs1 张三 张三 102 李四 王五 203 王五 小刚 20 select a.name,b.fs from a left join b on a.name = b.name结果 name fs 张三 10 李四 null 王五 20select b.name,a.id from b left join a on a.name = b.name 你自己试试就知道了ON (d.key=a.key)这里关联的谁 他就以谁为左链接

繁昌县18353326095: mysql的左连接和右连接是什么意思? - 技术
政温美利: left join 和 right join 用于将2个或以上表进行连接查询,left join会查出左表里所有数据,查出右表里满足条件的数据,而right join自然就是查出右表里所有数据,查出左表里满足条件的数据

繁昌县18353326095: MySQL 数据库中 left outer join 和 left join 什么区别 -
政温美利: 在某些数据库中, left join 称为 left outer join.left join 关键字是从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行.

繁昌县18353326095: mysql左连接和右连接的区别 -
政温美利: 一般所说的左连接,外连接是指左外连接,右外连接.左连接:select 列1,列2,列n fromtablea left join tablebon tablea.列 = tableb.列(正常是一个外键列) [此处表连接成一张大表,完全当成一张普通表看]where,having,group by ...照常写. 右连接:select 列1,列2,列n fromtablea right join tablebon tablea.列 = tableb.列(正常是一个外键列) [此处表连接成一张大表,完全当成一张普通表看]where,having,group by ...照常写.

繁昌县18353326095: sql left join 和join的区别 -
政温美利: left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 ,join就不存在.

繁昌县18353326095: mysql inner join 和left join 的区别 -
政温美利: inner join 两张表同时存在 left join 左表为主 右表可以不存在 right join 和left join 相反

繁昌县18353326095: SQL中的LEFT JOIN 的功能是什么? -
政温美利: 左外连接左外连接保留了第一个表的所有行,但只包含第二个表与第一表匹配的行.第二个表相应的空行被放入NULL值.具体可以看图解 http://hi.baidu.com/%CA%B7%C9%CF%D7%EE%C7%BF%B5%C4%B6%B9%BB%A8/blog/item/07c9d9fa715b8116a9d311b2.html

繁昌县18353326095: mysql左连接left join查询为什么报错 -
政温美利: 左连接a表是主表,c d表是否会被断开和on的条件有关,on的a表就能匹配到

繁昌县18353326095: mysql左连接右连接内连接基本句式怎么写 -
政温美利: TABLE A ;TABLE B 内连接:A INNER JOIN B ,在A中也有,在B中也有的数据才能查询出来 左连接:A LEFT JOIN B,连接查询的数据,在A中必须有,在B中可以有可以没有 右连接与左连接相反

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网