您当前的位置:首页 > 电脑百科 > 数据库 > 百科

600倍效率提升sql查询优化从几十秒到几十毫秒

时间:2023-03-28 15:27:16  来源:今日头条  作者:进击的程序猿

背景

运维反馈说线上一个接口越来越慢,大概二三十秒才有返回。

查看接口代码,定位问题出在sql查询效率上。

sql意图是将多个号码最新的数据返回给前端使用。

单表数据量 530万左右,id为主键,phone为普通索引

优化过程

  1. 原sql如下,通过in + 子查询方式查询
select * from
	t_user_track 
where
	id in 
    (select max(id) as id 
  		from t_user_track 
			where phone in ('xxxxx', 'xxxxx') 
			group by phone)

执行时间在30秒左右,

 

explAIn查看执行计划

 

可以看出子查询走上了索引,主查询没有走索引,全表查询,rows=2333216

  1. 同事写了一段新的sql来查询,如下
select * from (
            select
            DISTINCT *
            from t_user_track
            where
            phone in ('xxxxx', 'xxxx')
            order by locate_time desc
        ) t
        group by phone;

执行时间在4秒左右

 

查看执行计划

 

 

派生表查询走上了phone的索引,rows=157108,主查询没有走上索引,row=157108

  1. 改成如下sql,关联表查询
select *
  from t_user_track t1,
    (select max(id) as id from t_user_track 
  			where phone in ('xxxxxx', 'xxxxx') group by phone) t2
where t1.id = t2.id;

查询时间为0.04秒

 

执行计划如下

 

 

  1. 改成inner join关联表,如下sql
select * 
  from t_user_track t1 
  INNER JOIN
  (select max(id) as id from t_user_track where phone in ('xxxxxx', 'xxxxx') group by phone) t2
 on t1.id = t2.id

执行时间为0.041秒

 

 

执行计划如下

 

 

结果

3、4两种关联表查询效率最高

原理分析

  1. 3、4两种连表查询只有一次查询,且通过小表驱动大表,所以查询效率较高
  2. 第一种in + 子查询的方式,需要两次查询,查询效率较低

留下一个疑问in+子查询的方式,为什么子查询走了索引,主查询却没有走索引

MySQL官方文档

mysql手册也提到过,具体的原文在mysql文档的这个章节:

I.3. Restrictions on Subqueries

13.2.8. Subquery Syntax

摘抄:

1)关于使用IN的子查询:

Subquery optimization for IN is not as effective as for the = operator or for IN(value_list) constructs.

A typical case for poor IN subquery performance is when the subquery returns a small number of rows but the outer query returns a large number of rows to be compared to the subquery result.

The problem is that, for a statement that uses an IN subquery, the optimizer rewrites it as a correlated subquery. Consider the following statement that uses an uncorrelated subquery:

SELECT ... FROM t1 WHERE t1.a IN (SELECT b FROM t2);

The optimizer rewrites the statement to a correlated subquery:

SELECT ... FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.b = t1.a);

If the inner and outer queries return M and N rows, respectively, the execution time becomes on the order of O(M×N), rather than O(M+N) as it would be for an uncorrelated subquery.

An implication is that an IN subquery can be much slower than a query written using an IN(value_list) construct that lists the same values that the subquery would return.

2)关于把子查询转换成join的:

The optimizer is more mature for joins than for subqueries, so in many cases a statement that uses a subquery can be executed more efficiently if you rewrite it as a join.

An exception occurs for the case where an IN subquery can be rewritten as a SELECT DISTINCT join. Example:

SELECT col FROM t1 WHERE id_col IN (SELECT id_col2 FROM t2 WHERE condition);

That statement can be rewritten as follows:

SELECT DISTINCT col FROM t1, t2 WHERE t1.id_col = t2.id_col AND condition;

But in this case, the join requires an extra DISTINCT operation and is not more efficient than the subquery



Tags:sql查询   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
加快SQL查询的九种优秀实践
译者 | 陈峻审校 | 重楼如您所知,SQL多年来一直是开发和查询数据库的主要语言。在编程实践中,人们逐渐积累了各种在使用过程中的小技巧。下面,让我们来看看有关如何编写出更高...【详细内容】
2024-01-04  Search: sql查询  点击:(100)  评论:(0)  加入收藏
实用性极强的MySQL查询优化策略
前言在程序上线运行一段时间后,一旦数据量上去了,或多或少会感觉到系统出现延迟、卡顿等现象,出现这种问题,就需要程序员或架构师进行系统调优工作了。其中,大量的实践经验表明,调...【详细内容】
2023-12-25  Search: sql查询  点击:(90)  评论:(0)  加入收藏
Oracle数据库调优实战:优化SQL查询的黄金法则!
在数据库应用中,SQL查询是最常见且最频繁执行的操作之一。然而,当数据量庞大、查询复杂度高时,SQL查询性能可能变得低效。为了提高数据库的响应速度和吞吐量,我们需要进行SQL查...【详细内容】
2023-11-10  Search: sql查询  点击:(324)  评论:(0)  加入收藏
如何使用GPT作为SQL查询引擎的自然语言
译者 | 李睿审校 | 重楼如今,得益于ChatGPT这种生成式人工智能技术,使得用简单的语句查询数据集变得非常简单。与大多数生成式人工智能一样,OpenAI公司开发的API的结果仍然不完...【详细内容】
2023-10-27  Search: sql查询  点击:(350)  评论:(0)  加入收藏
MySQL查询语句揭秘:无限层次父子关系查询,轻松解锁数据维度!
在当今的数据驱动时代,对于处理具有层次结构的数据非常重要。例如,组织结构、分类层次、评论回复等都可以被看作是无限层次的父子关系。针对这类数据的查询通常需要一种特殊的...【详细内容】
2023-08-23  Search: sql查询  点击:(276)  评论:(0)  加入收藏
使用Python内置模块加速SQL查询
假设你正在查阅一本书的页面,你想要更快地找到你正在寻找的信息。你会怎么做呢?那么你可能会查找术语索引,然后跳转到引用特定术语的页面。SQL中的索引与书籍中的索引工作原理...【详细内容】
2023-08-22  Search: sql查询  点击:(251)  评论:(0)  加入收藏
教你进行MySQL查询操作
大家好,我是IT共享者,人称皮皮。今天给大家讲讲MySQL中的查询操作。前言我们在以前,大概学了一下如何通过命令创建数据库,创建表等基本操作。但是实际上啊,至少在我的实际工作...【详细内容】
2023-03-29  Search: sql查询  点击:(179)  评论:(0)  加入收藏
600倍效率提升sql查询优化从几十秒到几十毫秒
背景运维反馈说线上一个接口越来越慢,大概二三十秒才有返回。查看接口代码,定位问题出在sql查询效率上。sql意图是将多个号码最新的数据返回给前端使用。单表数据量 530万左右...【详细内容】
2023-03-28  Search: sql查询  点击:(172)  评论:(0)  加入收藏
MySQL查询慢别怪索引,没准是这些原因导致的
我熟练应用ctrl c和ctrl v 开发curd代码好多年了。 mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题。 遇到这种问题,我们一般也会想到是因为索引...【详细内容】
2022-07-12  Search: sql查询  点击:(349)  评论:(0)  加入收藏
MySQL查询是否安装&删除
1、查找以前是否装有mysql命令:rpm -qa|grep -i mysql 可以看到如下图的所示:说明之前安装了: MySQL-client-5.5.25a-1.rhel5 MySQL-server-5.5.25a-1.rhel52、停止mysql服务...【详细内容】
2022-03-10  Search: sql查询  点击:(359)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(5)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(13)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(15)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(27)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条