【MySQL】 性能优化之 延迟关联
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,【背景】某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下。使用工具查看数据库正在执行的sql ,排在前面的大部分是:SELECT id, cu_id, name, info,
千家信息网最后更新 2025年11月07日【MySQL】 性能优化之 延迟关联【背景】
某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下。使用工具查看数据库正在执行的sql ,排在前面的大部分是:
【分析】
针对limit 优化有很多种方式,
1 前端加缓存,减少落到库的查询操作
2 优化SQL
3 使用书签方式 ,记录上次查询最新/大的id值,向后追溯 M行记录。
4 使用Sphinx 搜索优化。
对于第二种方式 我们推荐使用"延迟关联"的方法来优化排序操作,何谓"延迟关联" :通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。
【解决】
根据延迟关联的思路,修改SQL 如下:
优化前

优化后:

优化后 执行时间 为原来的1/3 。
如果您觉得从这篇文章受益,可以赞助 北在南方 一瓶饮料 ^_^
某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下。使用工具查看数据库正在执行的sql ,排在前面的大部分是:
- 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;
【分析】
针对limit 优化有很多种方式,
1 前端加缓存,减少落到库的查询操作
2 优化SQL
3 使用书签方式 ,记录上次查询最新/大的id值,向后追溯 M行记录。
4 使用Sphinx 搜索优化。
对于第二种方式 我们推荐使用"延迟关联"的方法来优化排序操作,何谓"延迟关联" :通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。
【解决】
根据延迟关联的思路,修改SQL 如下:
优化前
点击(此处)折叠或打开
- root@xxx 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;
- +----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
- +----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
- | 1 | SIMPLE | relation | range | ind_endtime | ind_endtime | 9 | NULL | 349622 | Using where; Using filesort |
- +----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
- 1 row in set (0.00 sec)

优化后:
点击(此处)折叠或打开
- 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
- root@xxx 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;
- +----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
- +----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
- | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 20 | |
- | 1 | PRIMARY | a | eq_ref | PRIMARY | PRIMARY | 8 | b.id | 1 | |
- | 2 | DERIVED | relation | index | ind_endtime | PRIMARY | 8 | NULL | 733552 | |
- +----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
- 3 rows in set (0.36 sec)

优化后 执行时间 为原来的1/3 。
如果您觉得从这篇文章受益,可以赞助 北在南方 一瓶饮料 ^_^
数据
关联
时间
查询
延迟
方式
排序
数据库
性能
居高不下
业务
书签
典型
前端
大部分
工具
很快
思路
方法
正在
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库中如何显示表结构
三级考试网络技术题
sql数据库注释
杭州专业软件开发哪家可靠
java搭建内网穿透服务器
大学学网络安全报什么系
达内软件开发培训价格
国家一级网络安全协会
嵌入式软件开发助理做什么
失落的方舟欧美服怎么换服务器
铁锈战争怎么进官方服务器
分离数据库提示路径不存在
临沂大智软件开发集团
济南物流软件开发费用多少
莱茵克拉电梯服务器说明
深圳售后软件开发公司
一台服务器可以运行多少系统
理正数据库耕植土
同济 软件开发技术基础
游戏网站建设软件开发
计算机网络技术中职升高职
服务器管理网登不上
网络安全体检要求
随着网络技术
世界根服务器由谁管理
软件开发公司欢迎
国际版买服务器要钱吗
网络安全行业就业率
《网络技术与应用》
抚州高性价比服务器哪里好