最近,长期运营后的港台服出现一个问题,web充值很慢,用gm指令查询玩家信息也很慢。最后定位到MongoDB查询也很慢。
 
刚开始定位的时候,运营SA直接查指定的玩家,并反映很慢,就猜测是索引的问题。有可能是索引太大,没法全部放进内存,导致读索引需要多次读取磁盘,最后整个查询要4-5s才能完成。后来阅读了一下MongoDB的文档,发现其也是用B-Tree放索引的,也尽量将索引加载在内存里了。当然,索引有没有在内存里这个指标,还是没有日志或者查询结果暴露的……
 
后来,对面运营客服提醒,只有指定角色比较慢,也让运营的DBA做了分析,发现是有命中唯一索引的。优化只能去查询部分字段,避免全量查询来解决了。但是我让对方SA导出了指定查询慢的玩家数据,这个文档只有不到4MB,ssd读取这么小的数据不应该这么慢
 
于是继续翻文档,将explain、loglevel调整增加性能日志项、mongotop、mongostat等工具都玩了一遍,全部都提示查询时间在毫秒级别,命中索引,没看到哪个指标反映到现在秒级查询时间的状况
 
后来猜应该是字段太多,做了个小工具做分析,打印一个document里嵌套最深的字段,以及下级元素最多的字段。发现由于web充值慢的问题,台方客服一直往玩家身上发订单,数据没有及时清理,所以订单字段挂了2000张订单的信息……还有一处回收系统的设计缺陷,导致回收数据膨胀,一个数组有上万大小。这可能导致了MongoDB将数据序列化成bson时产生性能问题,不过所有统计工具都不会分析bson化所需时间,好郁闷
 
于是按生效快慢程度排了优先级,分别针对几个问题做处理。首先是将查询接口做特化处理,去掉这次分析出的庞大字段,该方法生效最快,影响较小,但是由于历史原因,具体用到的字段没有明确列出,没法做的太细和精准了。然后针对订单问题,做了玩家上线后清理订单的操作。最后,回收系统的bug做了修复,上线时做好数据清理
 
为了进一步压缩玩家文档大小,还紧急上线了一个orm方面的优化,如果一个结构体里都是默认字段,而该结构体也不在一个数组里,则整个结构体都不做存储,减少默认字段对空间的占用问题。优化后,原来查询慢的玩家,document大小缩小到原来一半,成效卓著

MongoDB慢查询性能分析的更多相关文章

  1. SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较

    SQL查询性能分析之(not in).(and not).().(!=)性能比较 SQL Server Bruce 3年前 (2013-01-08) 3284浏览 0评论 <:article c ...

  2. mongodb .explain('executionStats') 查询性能分析(转)

    mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) ...

  3. 玩转mongodb(五):mongodb 3.0+ 查询性能分析

    mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) ...

  4. SQL查询性能分析

    http://blog.csdn.net/dba_huangzj/article/details/8300784 SQL查询性能的好坏直接影响到整个数据库的价值,对此,必须郑重对待. SQL Serv ...

  5. MongoDB索引,性能分析

    索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...

  6. Mysql分页查询性能分析

    [PS:原文手打,转载说明出处,博客园] 前言 看过一堆的百度,最终还是自己做了一次实验,本文基于Mysql5.7.17版本,Mysql引擎为InnoDB,编码为utf8,排序规则为utf8_gene ...

  7. [MySQL]--查询性能分析工具-explain关键字

    explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. explain的使用方法很简单,只需要在select查询语句前面加上expl ...

  8. 基于Lucene查询原理分析Elasticsearch的性能

    前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...

  9. 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...

随机推荐

  1. 版本控制commit和update过程

    很早就使用了git.后来还管了一个VSS,但长时间以来git和VSS基本都当ftp使用,顶多知道其有回退旧版本的功能,但对“版本控制”这个词一直以来都没领会其内含. 比如我一直担心两个问题,一是拉取下 ...

  2. 跟随我在oracle学习php(10)

    正则表达式 做验证 做匹配 用符号来描述书写规则:/ 中间写正则表达式 /^ :匹配开头,$:匹配结尾 : /^ve/以ve开头的 /ve$/以ve结尾\d:一个任意的数字\w:一个任意的数字或字母\ ...

  3. 学习笔记------------解决margin塌陷

    首先来解释一下什么是marg塌陷? 父子嵌套元素垂直方向的margin,父子元素是结合在一起的,他们两个会取其中最大的值 正常情况下应该是父级元素相对于浏览器定位,而子级元素相对于父级元素定位 但是m ...

  4. Tomcat各个版本下载路径

    http://archive.apache.org/dist/tomcat/tomcat-7/     修改对应版本号即可比如 tomcat-8

  5. 常见IO模型

    在socket的通信中,recv,accept,recvfrom(UDP协议接收信息)这些阶段由于需要收到信息,才能继续下面的代码,所以这些阶段叫做阻塞,类似于我们python变成中的input函数, ...

  6. CodeForces - 1040B Shashlik Cooking(水题)

    题目: B. Shashlik Cooking time limit per test 1 second memory limit per test 512 megabytes input stand ...

  7. python机器可读数据-XML

    XML XML是一门标记语言.也就是说,它具有包含格式化数据的文档结构. XML文档本质上只是格式特殊的数据文件. 在XML文件中有两个位置可以保存数据值:2个标签之间,标签的属性. 导入XML数据 ...

  8. jmeter如何进行MQTT性能测试(测试前期准备一,性能测试需求)

    接到一个有关MQTT的性能测试任务,把查找资料到解决问题的过程都记录.分享下 首先先科普下性能测试中相关术语的解释及 说到性能测试.负载测试.压力测试.并发测试,很多人都是混合使用,或者一会叫压力测试 ...

  9. 杭电ACM1007

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. [server]利用python构建的服务器地址问题

    http://0.0.0.0:8000/ 利用github开源项目搭建AI上色师时,遇到了建立server却无法访问的问题,ip如上. 其实很简单,0.0.0.0并不是有效的ip地址,用localho ...