热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlunique_subquery_MySQL,一条两层subquery的坑爹优化

最近整一些见不得人的事情,每天都忙到很晚。悲剧。SELECTa.client_id,s.cnts_cnt,a.cnta_cnt,s.cnta.cnts_rateFRO

最近整一些见不得人的事情,每天都忙到很晚。悲剧。

SELECT a.client_id,

s.cnt s_cnt,

a.cnt a_cnt,

s.cnt / a.cnt s_rate

FROM (SELECT COUNT(*) cnt,

handle_client client_id

FROM tb_captcha cpout

WHERE expire_time > curdate ()

GROUP BY handle_client) a

LEFT JOIN (SELECT COUNT(*),

handle_client

FROM tb_captcha

WHERE id IN (SELECT MAX(id)

FROM tb_captcha

WHERE task_id IN (SELECT task_id

FROM tb_client_task_log

WHERE task_code IN ('registerRobotUserEmail','registerWeibo')

AND status = 0

AND executed_time > '2011-03')

GROUP BY task_id,

seq)

GROUP BY handle_client;) s ON a.client_id = s.client_id

ORDER BY s.cnt DESC;

同事写了个子查询,跑到mysql上乖乖停不下来,最后被我kill掉了。

哥来优化一下。

先建索引

在tb_captcha建索引(expire_time, handle_client), (task_id)

在tb_client_log上建索引(status, execuited_time)

subquery很坑爹当成exists跑。都是all scan。

0877b52edf072343c0a2ddcfbc67f9b0.png

查询后的的数据量太大,type为all

怎么改呢。

1.如果临时表不是很大,用临时表ok

2.用join代替子查询

用inner join优化最里面的子查询。

f5ec487cedb0ff6c16d49adb9ad5044f.png

可以看到里层已经将unique_dependency+all 优化成ref+range。测试性能有所提高,但是没有达到数量级的提高。大概提高了4,5倍。外面那个子查询还会将整个查询死掉。外面有个index type。

外部子查询用临时表优化

2c7ff27c9babaa5db9353ddca6a3ac0f.png

因为临时表都会比较小,所以这种方式对性能有很大的提高。

原来结果根本出不来。现在的执行时间是:

57058cced602b2ad7e783aa143fc482d.png

执行时间是10ms。

呵呵。应该算成功优化了。

再加上left join。

ed5c8ff6bfb1691918bd1982800e0562.png

10ms。ok。

a02efc6fa70e2b2bb41bb7ae59971aaa.png

大小: 113 KB

f54e1d7a0d402a9041491bd2117edb5b.png

大小: 111.5 KB

1cac0734639ea21097ae26c3a7f16f9b.png

大小: 44.1 KB

9decca542f054b200cc3ef5d44cfecc9.png

大小: 76.9 KB

e1df186540f9715107989e7c23b067dc.png

大小: 96.6 KB

0

0

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-03-23 15:00

浏览 1437

分类:数据库

评论



推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • 本文介绍了在MySQL8.0中如何查看性能并解析SQL执行顺序。首先介绍了查询性能工具的开启方法,然后详细解析了SQL执行顺序中的每个步骤,包括from、on、join、where、group by、having、select distinct、union、order by和limit。同时还介绍了虚拟表的概念和生成过程。通过本文的解析,读者可以更好地理解MySQL8.0中的性能查看和SQL执行顺序。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 这是一个愚蠢的问题,但我只是对此感到好奇.假设我在Pythonshell,我有一些我查询的数据库对象.我做:db.query(的queryString)该查询在0xffdf842c ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
author-avatar
mobiledu2502876847
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有