开发者社区> yangyi_dba> 正文

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

简介: 【背景】  某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下。使用工具查看数据库正在执行的sql ,排在前面的大部分是: SELECT id, cu_id, name, info, biz_type, gmt_creat...
+关注继续查看
【背景】
  某业务数据库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. 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;
  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. 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;
  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 。

如果您觉得从这篇文章受益,可以赞助 北在南方 一瓶饮料 ^_^

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
呕心沥血写了三天3两夜24k字的MySQL详细教程(三)
呕心沥血写了三天3两夜24k字的MySQL详细教程(三)
9 0
小知识随手记:使用Navicat进行数据库表设计
小知识随手记:使用Navicat进行数据库表设计
9 0
Linux系统安装Mysql5.7数据库图文笔记(CentOS7)
Linux系统安装Mysql5.7数据库图文笔记(CentOS7)
5 0
小知识随手记:MD5加密与SHA-1加密
小知识随手记:MD5加密与SHA-1加密
15 0
SQL学习第一天打卡
主要为SQL中的基础概念,创建、删除、修改数据库、表等基本语法,四种基本数据类型等学习心得。
5 0
ESC服务器体验
我是一名软件工程专业的学生,目前大三。在学习云计算课程时了解到阿里云服务器,通过阿里云服务器学习到了Linux系统的相关操作,学习了利用ngix搭建网站。也学会了open stack基础知识。
16 0
Linux基础知识
配置Raid5(1) 添加5块8G硬盘,以root账户登录,将上述5块硬盘都只划分一个主分区, 打印分区情况。图1:首先打开虚拟机,恢复快照 图2:如图所示,已恢复快照图3:关机虚拟机,然后选择编辑此虚拟机图4:在虚拟机设置窗口,选择添加选项图5:在添加硬件向导窗口,选择硬盘选项,然后单击下一步继续图6:在添加硬件向导窗口,选择SCSI选项,然后单击下一步继续图7:在添加硬件向导窗口,选择创建新虚拟磁盘选项,然后单击下一步继续图8:在添加硬件向导窗口,设置磁盘大小为8G,然后单击下一步继续图9:根据图4、5、6、7、8的步骤再添加4块磁盘图10:开启虚拟机,以将raid5格式化为ext4文件系
4 0
【Kotlin 初学者】空安全与异常
在Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null。这使得在Java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。
8 0
基于阿里云Linux系统安装宝塔面板详细教程
基于阿里云Linux系统安装宝塔面板详细教程
10 0
【Kotlin 初学者】集合
一、集合 Kotlin中的集合用于在一个单元中存储一组相关对象。通过使用集合,可以存储,检索操作和聚合数据,也可以作为值参传给函数。 Kotlin中大致分为两种不同集合的形式。它们是: 只读集合(不变) 可变集合
9 0
+关注
yangyi_dba
数据库相关技术专家
972
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载