最近,长期运营后的港台服出现一个问题,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. QT:图形的描画(折线,柱状图,多边形)

    1. 创建一个继承于QWidget的类,重载一个叫paintEvent的函数, 2. 在paintEvent函数中调用Qpainter类,此类是一个重量级类,在paintEvent函数尽量只创建一次 ...

  2. nginx 出现504 Gateway Time-out的解决方法

    本文介绍nginx出现504 Gateway Time-out问题的原因,分析问题并提供解决方法. 1.问题分析nginx访问出现504 Gateway Time-out,一般是由于程序执行时间过长导 ...

  3. python - 列表,元组

    1.列表       定义:能装对象的对象     在python中使用[] 来描述列表,内部元素用逗号隔开,对数据类型没有要求.     列表存在索引和切片,和字符串的操作是一样的   2.列表相关 ...

  4. servlet(3)

    常见的网络访问后缀: - .html : 网页 - .htm : 网页 - .php : php技术实现的动态网页 - .jsp : Java Server pages Java代码+HTML代码实现 ...

  5. 【推荐】Data Structure Visualizations

    University of San Francisco    David Galles 功能:可视化数据结构&算法实现过程 网站地址  https://www.cs.usfca.edu/~ga ...

  6. vue页面操作技巧

    // this.$router.push({ path: "https://www.baidu.com/"}); // POST请求的时候 // this.$router.push ...

  7. BatchPreparedStatementSetter,用法

    spring批量更新数据 ---- BatchPreparedStatementSetter (2007-04-15 15:41:29) 转载▼ 标签: spring batchpreparedsta ...

  8. 使用机房的网线 连接到自己的电脑 解决Internet没有访问权限问题

    在机房把机子上的网线拔了,插在自己的笔记本上.发现并不能用,能识别Internet,但是没有访问权限. 解决办法: 去查看机房的机子的IP地址和DNS地址,就是那根网线原本连接的那台机.(网线先别拔出 ...

  9. Java 优化要点

    java优化四个要素:1.-server服务器方式启动2.-Xms1g -Xmx1g初始大小与最大大小保持一致 -Xss256k线程栈从默认128扩到256  3.-Xmn512m新生代内存:年老代内 ...

  10. Docker搭建LNMP网站平台

    1.自定义网络 [root@linux-docker01 ~]# docker network create lnmp 67e7e0736b2c58f8f81eed50130803b34be0583f ...