最近,长期运营后的港台服出现一个问题,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. [转]java 关于httpclient 请求https (如何绕过证书验证)

    原文:http://www.blogjava.net/hector/archive/2012/10/23/390073.html 第一种方法,适用于httpclient4.X 里边有get和post两 ...

  2. day 07 数据类型,集合,深浅copy

    1.day 06 内容回顾 小数据池 int :-5-256 str:特殊字符 ,*20 ascii:8位 1字节 表示一个字符 unicode:32位 4个字节 , 表示一个字符 字节表示8位表示一 ...

  3. git(三) 使用github

    1.创建仓库 ① 注册github账户,登录后,点击"New respository ". ② 在新页面中,输入项目的名称,勾选'readme.md',点击'create repo ...

  4. js 实现异步上传图片+预览

    两种js实现方式,一种用原生的ajax:另一种用JQuery,例子比较简单,直接上代码. <!DOCTYPE html> <html> <head> <tit ...

  5. css继承属性

    在css中我们经常会遇到一些子元素继承父元素的情况 , 有时候不清楚有哪些属性会继承, 在开发中会给我们带来一些麻烦 ,稍作整理还是很有必要. 一.有继承性的属性 1.字体系列属性 font:组合字体 ...

  6. docker开发实践

    一:docker的定义和使用场景: Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VM ...

  7. 活代码LINQ——04

    一.主模块代码: 'Fig.4.16:GradeBookTest.vb 'Create and manipulate a GradeBook object;illustrate validation ...

  8. 安装SQl Server 报错 "需要 Microsoft.NET Framework 3.5 ServicePack 1" 解决方法

    前言 之前装Sql Server都没遇到过这样的问题, 昨天重装了系统之后, 然后安装SQl Server 报错,提示 "需要 Microsoft.NET Framework 3.5 Ser ...

  9. Java获取客户端真实IP

    一般情况下,我们可以使用 request 的 getRemoteAddr()  方法获取客户端实际 IP ,但是使用反向代理后,我们使用 getRemoteAddr() 是无法获取真实的  IP 的. ...

  10. impala和kudu使用的小细节

    七堇年:我们要有最朴素的生活与最遥远的梦想 . 即使明日天寒地冻,路远马亡.   加油! 之前入门的小错误总结,建表都会出错,真的好尴尬 还是要做好笔记 第一个错误: error:AnalysisEx ...