最近,长期运营后的港台服出现一个问题,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. C#调用java包里的方法

    用IKVM,步骤: 下载ikvmbin-7.2.4630.5.zip,解压,把bin目录所在路径加到环境变量path里 2.电脑开始->CMD,输入ikvmc –out:”输出dll文件的路径” ...

  2. angular组件

  3. CentOS7系统上的LAPACK源码安装

    参考链接:linux下安装blas和lapack BLAS 和 LAPACK 这两个数学库是很多 Linux 科学计算软件需要调用的,所以经常会用到. LAPACK,其名为Linear Algebra ...

  4. vue2.0自学笔记

    前言: 一.优点: 轻量级.高效率.上手快.简单易学.文档全面而简洁 二.功能: 1.模板渲染 2.模块化 3.扩展功能:路由.Ajax 三.课程包含: 1.Vue实例 2.Vue组件 3.Vue指令 ...

  5. 【调试基础】Part 1 寄存器

    01 寄存器体系 02 16/32/64位寄存器

  6. git(三) 使用github

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

  7. Python类之类的成员

    对于一个学C++的朋友来说,Python类中,哪些是私有成员,哪些是共有成员,估计一直傻傻分不清. 一.本篇博客要解决的问题: Python类中,哪些是私有成员?哪些是共有成员? 二. 关于Pytho ...

  8. JQuery案例二:实现全选、全不选和反选

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. spark提交jar包时出现unsupported major.minor version 52.0错误的解决方案

    一.问题: 最近在spark集群上做一个项目,打包提交jar包时,出现了unsupported major.minor version 52.0的报错,而在local模式运行却能正常运行! 二.错误原 ...

  10. content-type的几种取值

    四种常见的 POST 提交数据方式 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主体.类似于下 ...