【MySQL】性能优化 之 延迟关联

【背景】
  某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下。使用工具查看数据库正在执行的sql ,排在前面的大部分是:

  1. SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where biz_type =‘0‘ AND end_time >=‘2014-05-29‘ ORDER BY id asc LIMIT 149420 ,20;

表的数据量大致有36w左右,该sql是一个非常典型的排序+分页查询:order by col limit N,OFFSET M , MySQL 执行此类sql时需要先扫描到N行,然后再去取 M行。对于此类大数据量的排序操作,取前面少数几行数据会很快,但是越靠后,sql的性能就会越差,因为N越大,MySQL 需要扫描不需要的数据然后在丢掉,这样耗费大量的时间。

【分析】
针对limit 优化有很多种方式,
1 前端加缓存,减少落到库的查询操作
2 优化SQL
3 使用书签方式 ,记录上次查询最新/大的id值,向后追溯 M行记录。
4 使用Sphinx 搜索优化。
对于第二种方式 我们推荐使用"延迟关联"的方法来优化排序操作,何谓"延迟关联" :通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。

【解决】
根据延迟关联的思路,修改SQL 如下:
优化前

  1. [email protected] 12:33:48>explain SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where biz_type =\‘0\‘ AND end_time >=\‘2014-05-29\‘ ORDER BY id asc LIMIT 149420 ,20;
  2. +----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
  3. | id | select_type | table       | type  | possible_keys | key         | key_len | ref  | rows   | Extra                       |
  4. +----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
  5. | 1  | SIMPLE      | relation    | range | ind_endtime   | ind_endtime | 9       | NULL | 349622 | Using where; Using filesort |
  6. +----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
  7. 1 row in set (0.00 sec)

其执行时间:

优化后:

  1. SELECT a.* FROM relation a, (select id from relation where biz_type =‘0‘ AND end_time >=‘2014-05-29‘ ORDER BY id asc LIMIT 149420 ,20 ) b where a.id=b.id
  1. [email protected] 12:33:43>explain SELECT a.* FROM relation a, (select id from relation where biz_type =‘0‘ AND end_time >=‘2014-05-29‘ ORDER BY id asc LIMIT 149420 ,20 ) b where a.id=b.id;
  2. +----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
  3. | id | select_type | table       | type   | possible_keys | key     | key_len | ref  | rows   | Extra |
  4. +----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
  5. | 1  | PRIMARY     | <derived2>  | ALL     | NULL             | NULL    | NULL     | NULL | 20     |       |
  6. | 1  | PRIMARY     | a                 | eq_ref | PRIMARY       | PRIMARY | 8       | b.id | 1      |       |
  7. | 2  | DERIVED     | relation        | index  | ind_endtime   | PRIMARY | 8       | NULL | 733552 |       |
  8. +----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
  9. 3 rows in set (0.36 sec)

执行时间:

优化后 执行时间 为原来的1/3 。

时间: 2024-10-25 11:08:27

【MySQL】性能优化 之 延迟关联的相关文章

mysql性能优化教程(转)

Mysql 性能优化教程 目录 目录 背景及目标 Mysql 执行优化 认识数据索引 为什么使用数据索引能提高效率 如何理解数据索引的结构 如何理解影响结果集 理解执行状态 常见分析手段 分析流程 总结 Mysql 运维优化 存储引擎类型 内存使用考量 性能与安全性考量 存储压力优化 运维监控体系 Mysql 架构优化 架构优化目标 防止单点隐患 方便系统扩容 安全可控,成本可控 分布式方案 分库&拆表方案 主从架构 故障转移处理 缓存方案 缓存结合数据库的读取 缓存结合数据库的写入      

redmine在linux上的mysql性能优化方法与问题排查方案

iredmine的linux服务器mysql性能优化方法与问题排查方案 问题定位: 客户端工具: 1. 浏览器inspect-tool的network timing工具分析 2. 浏览器查看 response header, 分析http server 与 web server.       服务器工具:   0. nmon 查看各类系统负载, rrdtool 查看网络状况.   1. uptime看cpu负载;    free看内存;  mem ; cat /proc/meminfo以及  i

Mysql性能优化--索引优化 ( 索引不再是黑盒子 )

课程目录:│  ├─第1章 课程开篇│  │      1-课程开篇│  │      │  ├─第2章 InnoDB 行存储结构│  │      1-InnoDB行存储结构--本章大纲│  │      2-InnoDB行存储结构1--变长字段长度列表│  │      3-InnoDB行存储结构2--NULL值列表│  │      4-InnoDB行存储结构3--VARCHAR及行溢出│  │      │  ├─第3章 InnoDB 数据页结构│  │      1-InnoDB页存储

MySQL 性能优化的最佳20多条经验分享

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的                    事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语                句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的M

MySQL性能优化的最佳20+条经验

http://www.pythonclub.org/mysql/optimize-20-tips 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存

MySQL &#183; 性能优化 &#183; MySQL常见SQL错误用法

前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也存在部分客户在使用MySQL数据库的过程中遇到一些比如响应时间慢,CPU打满等情况.阿里云RDS专家服务团队帮助云上客户解决过很多紧急问题.现将<ApsaraDB专家诊断报告>中出现的部分常见SQL问题总结如下,供大家参考. 常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如

20多条MySQL 性能优化经验分享

当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要

MySQL性能优化的21个最佳实践

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被My

MySQL 性能优化---索引及优化

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.MySQL性能优化之-影响性能的因素 1.商业需求的影响 Myisam存储引擎内置一个计数器,count(*)时直接从计数器读取:而通过innodb存储引擎查找某个数据时,是必须扫描全表的,所以当执行对表的统计(即使用count(*)函数)时,myisam要比innodb要快的很多.所以一般在innodb上执行count(*)时一般要