最近,长期运营后的港台服出现一个问题,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. 2015-10-28 C#4

    五.继承 5.1 父类又称(基类,超类)是被继承的类,子类又称派生类. 5.2 A:B,A就叫子类,B叫父类,B里面所有的成员(字段,方法)都会被A继承. B里面的私有成员,A也是继承下来了的,只是没 ...

  2. js 批量提交数据

    // 批量提交数据 let pageSize = 100, total = dataTmp.length, list = dataTmp let totalPage = Math.ceil(total ...

  3. jieba库与词云的使用——以孙子兵法为例

    1.打开cmd安装jieba库和 matplotlib. 2.打开python,输入代码.代码如下: from wordcloud import WordCloud import matplotlib ...

  4. 小白的python之路10/29 文件归档

    一打包解包文件 [root@localhost ~]# cd /test/[root@localhost test]# touch a.txt b.txt c.txt[root@localhost t ...

  5. Android最火热修复实战

    Sophix官网文档地址 https://help.aliyun.com/document_detail/53240.html 快速接入 项目build.gradle的repositories节点下添 ...

  6. Java中的异常处理与抛出

    一.异常处理 程序运行过程中出现的,导致程序无法继续运行的错误叫做异常. Java中有多种异常,所有异常的父类是Throwable,他主要有两个子类Error和Exception. Error一般是J ...

  7. Altium designer 新建快捷键

    示例: 1.按下Ctrl: 2.点击需要建立快捷键的图标:点击交互式布线图标,然后在选择性输入要用到的快捷键:

  8. [Oracle][RMAN] Use RMAN to Migrate database from CentOS_5-11201-SingleDB to OracleLinux_5-11204-SingleDB

    リンク:How to Move/Restore DB to New Host and File System using RMAN (Doc ID 1338193.1)https://docs.ora ...

  9. ecplise中设置字符编码

    ecplise 设置 1 ecplise编码格式 右键 在general-workspace- text file encoding 选择utf-8 2 jsp文件编码格式 web-jspfile-e ...

  10. centos下使用yum 安装pip

    本文为转载:原文出处:https://www.cnblogs.com/saolv/p/6963314.html centos下安装pip时失败: [root@wfm ~]# yum -y instal ...