文档章节

order by导致离线消息MySQL压力剧增

鉴客
 鉴客
发布于 2011/07/20 23:57
字数 633
阅读 252
收藏 5
离线消息MySQL压力很大,大量的sql语句都在执行
select gmt_create, type, from_id, content from im_offlinemsg_200811 where to_id = 'cntaobao???????'and (expire_time is null or expire_time >now())
order by msg_id;
这样的操作。

但是从我们的性能统计来看,所有的order by都是在内存中执行的,没有在硬盘上执行。

将排序改到应用层排序,整个性能立马提高了很多。于是新的疑问就来了,难道mysql的排序性能这么差吗?

http://forge.mysql.com/wiki/MySQL_Internals_Algorithms这里发现了mysql的排序算法原理。

mysql的filesort算法有两种,一种是最初的算法,在MySQL 4.1以前只有这种算法,另外一种是改进的filesort算法,它出现在
MySQL 4.1以后(blob和text类型的字段不能采用这种改进算法)

最初的算法流程如下(简单起见,假设数据小于等于sort_buffer_size,详细可以见上面的url):
1.读取所有的满足条件的数据,只包含sort key和row pointer两种数据
2.在buffer中执行qsort排序
3.排完序后,再根据row pointer去读取相应的行数据

从中可以看出,每次排序都需要读两次表,而根据row pointer去读表往往都是随机离散读的,所有其开销非常大。


改进后的算法是:
1.读取所需要的数据,包含sort key,row pointer和查询所需要访问的字段
2.根据sort key排序
3.按排序后的顺序读取数据,由于sort_buffer_size中包含了所需要的字段,因此不需要再回表了,可以直接返回结果给客户端。

很明显,这种改进的方法对sort_buffer_size的需求也大大增加,所以为了防止性能下降,mysql增加了一个参数max_length_for_sort_data
当第一步中除了sort key以外的字段内容大于max_length_for_sort_data这个参数时,mysql将采用第一种排序算法。

该参数默认为1024个字节,而在我们的离线消息中内容较大,所以mysql就采用了第一种排序算法,结果每次都要回表,所以性能很差。
将max_length_for_sort_data该参数调大,性能得到了很大的提高。


人人都说mysql简单,其实在DB层面没有简单的事情,任何一个细小的东西里面都大有文章可讲啊。
另外http://forge.mysql.com/wiki 这个wiki上面的内容很不错,强烈推荐一下。

本文转载自:http://logzgh.itpub.net/post/3185/474019

鉴客

鉴客

粉丝 953
博文 35
码字总数 1356
作品 0
长春
高级程序员
私信 提问
加载中

评论(1)

gtd
gtd
http://forge.mysql.com/wiki 这个页面不见了?
请问磨姑街的IM软件怎样实现的个人离线消息和群离线消息,群支持的最大成员数是多少

@TeamTalk 你好,想跟你请教个问题: 请问磨姑街的IM软件怎样实现的个人离线消息和群离线消息,离线消息如果写到MYSQL,怎么样保证写入未完成时用户重新上线能读到呢,离线消息是定时获取的吗...

程序猿之一
2014/11/14
1K
0
kafka消息系统-初识kafka

为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据...

xinlingjun2007
2018/05/05
0
0
说说ejabberd离线消息踩过的坑

使用过ejabberd的或许知道,也许踩过这个坑。那么就说说我们踩过的ejabberd的离线消息的坑吧。 ejabberd原生的离线消息的机制是,一般用户保存100条离线消息,管理员保存5000条离线消息。超过...

nidongwo-
2016/08/29
149
0
Asp.Net 网站性能优化 缓字决 (上) 缓冲写数据

通常情况下Asp.Net 网站的底层数据存储都是关系数据库,关系数据库资源比较昂贵,而且也很容易造成瓶颈。缓字决文章就是为大家介绍如何有效使用缓存,异步写缓冲数据库的压力,从而保证网站的...

长平狐
2012/06/08
69
0
TiDB 在摩拜单车的深度实践及应用

作者介绍:吕磊,摩拜单车高级 DBA。 一、业务场景 摩拜单车 2017 年开始将 TiDB 尝试应用到实际业务当中,根据业务的不断发展,TiDB 版本快速迭代,我们将 TiDB 在摩拜单车的使用场景逐渐分...

TiDB
02/19
90
0

没有更多内容

加载失败,请刷新页面

加载更多

编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
11分钟前
1
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
26分钟前
55
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
53分钟前
5
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
56分钟前
7
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
57分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部