`
ldd600
  • 浏览: 101814 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11078
社区版块
存档分类
最新评论

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

 
阅读更多

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

 

 

 

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。



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

 

怎么改呢。

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

2.用join代替子查询

 

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


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

 

外部子查询用临时表优化

 


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

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

 


执行时间是10ms。

 

 

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

 

再加上left join。

 


10ms。ok。

  • 大小: 113 KB
  • 大小: 111.5 KB
  • 大小: 44.1 KB
  • 大小: 76.9 KB
  • 大小: 96.6 KB
0
0
分享到:
评论

相关推荐

    MySQL 子查询(subquery)语法与用法实例.docx

    MySQL 子查询(subquery)语法与用法实例.docx

    【大厂面试题】MySQL执行计划及SQL优化

    【大厂面试题】MySQL执行计划及SQL优化 知识点标签:explain、sql优化、索引、sql性能问题 题目描述 MySQL执行计划及SQL优化 1.SQL语句表头运行一个explain时,执行后所显示的表头字段如下: id : select查询的...

    MySQL 5.1中文手冊

    14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储...

    MySQL 5.1官方简体中文参考手册

    2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. 其它Unix注意...

    MySQL 5.1参考手册

    14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储...

    MySQL DBA培训全套教程

    11.subquery.pdf 12.cursor.pdf 13.optimization.pdf 14.replication_1.pdf 14.troubleshooting.pdf 15.replication_2.pdf 16.replication_3.pdf 17.mysql_HA.pdf 18.mysql_HA_NDB.pdf 19.mysql_scale.pdf...

    mysql5.1中文手册

    将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. ...

    MySQL 5.1参考手册 (中文版)

    14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储...

    MySQL 5.1参考手册中文版

    2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. 其它Unix...

    Laravel开发-eloquent-subquery-magic

    Laravel开发-eloquent-subquery-magic 提供使用许多子查询功能(如FromSubQuery或LeftJoinSubQuery)的雄辩扩展

    MYSQL中文手册

    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT ...

    mysql官方中文参考手册

    14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储...

    mysql中explain用法详解

    如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序。explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列:1,id select识别符。这是select的查询...

    MySQL5.1参考手册官方简体中文版

    2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. 其它Unix注意...

    Oracle中的优化器如何进行评估优化

    不同的SQL结构有时具有同样的操作(例如:= ANY (subquery) and IN (subquery)),Oracle会把他们映射到一个单一的语义结构。本文将讨论优化器如何评估优化如下的情况和表达式:常量 LIKE 操作符 IN 操作符 ANY和...

    Apply a Like Filter through an IN Subquery

    Apply a Like Filter through an IN Subquery Essbase BIEE

    MySQL查询优化之explain 执行计划 深入解析(精品)

    文章目录相关文章一. 前言二. `Explain` 用途三. `Explain`语法四. 执行效果4.1. 命令行4.2. 可视化工具–`HeidiSQL Portable 9.4`五. Explain 字段详解5.1. 一览全局字段5.2. Id字段5.2.1. id相同5.2.2. id不相同...

    MySQL_5[1].1_zh.chm中文版的mayql说明书

    Mysql 中文版 方便的查询mysql命令~~~ 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP ...

    MySQL嵌套查询实例详解

    本文实例分析了MySQL嵌套查询。分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): 1. SELECT语句的子查询 语法: ...

Global site tag (gtag.js) - Google Analytics