专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
Java知音  ·  公司新来一个技术总监:禁止将 UUID ... ·  12 小时前  
Java知音  ·  公司新来一个技术总监:禁止将 UUID ... ·  12 小时前  
51好读  ›  专栏  ›  数据分析与开发

一个 20 秒 SQL 慢查询优化的经历与处理方案

数据分析与开发  · 公众号  · 数据库  · 2017-05-18 20:33

正文

(点击 上方公众号 ,可快速关注)


作者:暗夜在火星

my.oschina.net/dogstar/blog/398879

如有好文章投稿,请点击 → 这里了解详情


背景


前几天在项目上线过程中,发现有一个页面无法正确获取数据,经排查原来是接口调用超时,而最后发现是因为SQL查询长达到20多秒而导致了问题的发生。


这里,没有高深的理论或技术,只是备忘一下经历和解读一些思想误区。


复杂SQL语句的构成


这里不过多对业务功能进行描述,但为了突出问题所在,会用类比的语句来描述当时的场景。复杂的SQL语句可以表达如下:


SELECT * FROM a_table AS a

LEFT JOIN b_table AS b ON a.id = b.id

WHERE a.id IN (

SELECT DISTINCT id FROM a_table

WHERE user_id IN (100,102,103) GROUP BY user_id HAVING count (id) > 3

)


关联查询


从上面简化的SQL语句,可以看出,首先进行的是关联查询。


子查询


其次,是嵌套的子查询。此子查询是为了找出多个用户共同拥有的组ID。所以语句中的“100,102,103”是根据场景来定的,并且需要和后面“count(id) > 3”的个数对应。简单来说,就是找用户交集的组ID。







请到「今天看啥」查看全文