前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >存储优化(3)-mongo大表加索引

存储优化(3)-mongo大表加索引

作者头像
方丈的寺院
发布于 2020-04-01 08:44:51
发布于 2020-04-01 08:44:51
2.9K00
代码可运行
举报
文章被收录于专栏:方丈的寺院方丈的寺院
运行总次数:0
代码可运行

摘要

存储优化(2)-排序引起的慢查询优化中我们提到过排序对查询选择索引的影响。但是的解决办法就是增加一个索引。在线上给mongo的大表增加一个索引要慎重。在增加索引的过程中也遇到了一些问题,这边进行相关的记录与分析。

问题描述

表结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_id,biz_Id,version,name

索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 主键索引2. biz_id,version联合索引

查询语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"query":{"find":"historyRecord","filter":{"bizId":1234567},"sort":{"_id":-1},"limit":1}}

增加一个索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bizId,_id
代码语言:javascript
代码运行次数:0
运行
复制

增加索引过程

对于大表(该表记录数5亿),建立索引过程涉及到锁表,大量的读写操作、数据同步,肯定会影响线上的操作。所以选择在业务低谷期,建立一个background的index,这样不会锁表。注:

mongo4.2以后优化了建立索引过程,不需要background参数了https://docs.mongodb.com/manual/reference/command/createIndexes/#dbcmd.createIndexes

创建完索引后,通过客户端连接,查看执行计划,始终扫描一行。完美,走到了新的索引。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"executionStats" : {       "executionSuccess" : true,       "nReturned" : 1,       "executionTimeMillis" : 0,       "totalKeysExamined" : 1,       "totalDocsExamined" : 1

然后再观察几天慢sql,大吃一惊发现还是存在慢查询,但是相同的语句,放到客户端查询的时候,又是执行的新索引。查看system.profiles中慢日志

当时这条慢查询语句走的是cached_plan.

也就是说,走的是plan cache,已经缓存的执行计划。

那是不是因为这个索引是后来加的,plan-cache还没有更新的。清理掉执行计划缓存,执行操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.historyRecord.getPlanCache().clear()

继续观察,发现并没有什么用。百思不得其解,在深入解析 MongoDB Plan Cache找到一些思路,MongoDB的执行计划

其中扫描N次中N是10倍的执行计划缓存的索引扫描次数。

看了下缓存计划中的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.getCollection('historyRecord').getPlanCache().listQueryShapes()    {        "query" : {            "bizId" : "xxxxx"        },        "sort" : 0            "_id" : -1.0        },        "projection" : {}    },

而该查询使用"bizId,version"索引,而bizId="xxxx"下面的索引值是100左右。我们的数据分布,bizId,version在100以内的可能是95%,只有5%的在100以上,这会给索引判断造成误判。

总结

最后解决是通过强制索引来避免索引误判,当然也可以将排序改成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sort({bizId:-1,_id:-1})

这样也不会误判

总结一下:

  1. 大表加索引,需要确保不会block表的其他操作,尽量选择空闲时候,以background方式创建
  2. 增加完索引后,需要check索引是否发挥作用,只是通过explain有可能误判,还是需要结合数据库的slowlog来判断
  3. 同一个查询数据库也不总是使用一个索引,会根据查询情况进行调整。需要结合plan cache等情况来分析
  4. 修复数据库索引判断错误可以通过强制索引,或者调整语句引导数据库作出正确的判断。

参考

https://mongoing.com/archives/5624

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
是否需要对因子进行『行业中性化』处理?
量化投资与机器学习微信公众号,是业内垂直于量化投资、对冲基金、Fintech、人工智能、大数据等领域的主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险、高校等行业30W+关注者,曾荣获AMMA优秀品牌力、优秀洞察力大奖,连续4年被腾讯云+社区评选为“年度最佳作者”。 来自:Financial Analysts Journal 标题:Is Sector Neutrality in Factor Investing a Mistake? 作者:Sina Ehsani、Campbell R. Harvey、Feifei Li
量化投资与机器学习微信公众号
2024/05/11
3820
是否需要对因子进行『行业中性化』处理?
单因子测试(中)——分层测试法
本文总结单因子测试的分层测试法。与回归法相比,分层测试法相对繁琐,但能展示更多细节。 分层测试法的思路是在统一的规则下, 利用单因子构建投资组合进行回测,然后对投资组合的表现进行全面评价,通过投资组合的表现说明因子的有效性。
量化小白
2019/01/22
9.4K0
101因子新测评,会有哪些新发现?
之前公众号分享过网友自行编写的WorldQuant 101因子源代码,大家有需要可以点击链接进行免费获取。
量化投资与机器学习微信公众号
2019/05/23
2.6K0
101因子新测评,会有哪些新发现?
单因子测试框架
SignalFactorAnalyse单因子测试框架哪些因子可以为组合提供超额收益?这是构建多因子模型的第一步,也是最关键一步。 特征选择非常关键,只有把握关键特征才能对数据达到重要性认识,选择好的因子,才能获取超额收益率。 对于传统交易经验、金融理论、微观市场、机器学习、深度学习等不断挖掘出来的巨量待验因子,一个快速且有效的因子测试框架,将是Multi-factor策略系统中最为关键的一环。 因子模型测试思路 因子有效性的判断与筛选: •备选因子确定: 数学意义、经济意义、统计意义 •预处理: 数据空缺与
企鹅号小编
2018/01/10
2.6K0
单因子测试框架
因子评估全流程详解
首先,这是一篇值得收藏的干货文。基本上覆盖到了因子评估的每个方面每个细节,小白友好型,很长,慢慢看。
量化小白
2023/04/03
5K1
因子评估全流程详解
单因子测试(下)——回归测试法
之前两篇分别总结了因子数据的预处理和单因子测试的分层测试法,本篇总结回归测试法,相较于分层测试法,回归测试法更简洁。
量化小白
2019/01/22
6.1K1
多因子尝试(一):因子加权方法在选股中的应用
之前在A股动量与反转的实证过程中,提到了因子择时和风格轮动的重要性,本篇算是对因子择时的一个小小的尝试,没有什么创新性,只是把现在比较传统的方法都拿来试了一遍,目前没有能力创造方法,只做方法的搬运工。
量化小白
2019/08/29
6.6K0
从零开始学量化(五):用Python做回归
回归作为数据分析中非常重要的一种方法,在量化中的应用也很多,从最简单的因子中性化到估计因子收益率,以及整个Barra框架,都是以回归为基础,本文总结各种回归方法以及python实现的代码。
量化小白
2019/07/10
8.2K0
动量因子30年
自从Jegadeesh和Titman(1993)验证了“买入过去收益较高的股票,卖出收益较低的股票“的交易策略能够带来显著的正收益,动量效应的提出至今已经有30多年。这种动量效应在各种资产类别和全球范围内都很强劲,这可能是对有效市场假说最直接的反驳。对投资者来说,动量是一种稳健、多变且有利可图的投资策略,这种策略已被共同基金、对冲基金和被动ETF广泛采用。对于金融研究来说,动量与Fama(1970)的弱形式有效市场假说存在显著矛盾。
量化投资与机器学习微信公众号
2023/04/20
1.4K0
动量因子30年
Barra系列(二):收益模型
不同国家的市场也是影响个股超额收益的因素之一,需要在收益模型中加入国家因子。为了让收益模型解唯一,约束市值加权的行业因子收益率之和为零。
量化小白
2020/02/25
2.4K0
因子的有效性分析基于7种机器学习算法【系列54】
今天,继续我们的机器学习应用量化投资系列。本期我们介绍一篇研究报告,详细的介绍了7中机器学习算法在因子有效性上的展现。希望给大家在写策略时做一些参考借鉴。 前言 逻辑依旧明了,机器学习并非黑箱 谈到机器学习,大家最忌讳的便是黑箱问题。其实不必,理解机器学习算法,逻辑实则简单,比如相同的因子特征将会有相同的表现。在实战中,我们发现, 该逻辑十分有效,在我们的机器学习选股模型中,该逻辑连续十几年不曾被打破。 Adaboost 最稳定,朴素贝叶斯收益最高 全市场选股,市值中性选股等权加权,行业中性选股等
量化投资与机器学习微信公众号
2018/03/20
2K0
因子的有效性分析基于7种机器学习算法【系列54】
【中国市场】2018第二季度因子表现,我都惊呆了!
Style Analytics是一家面向投资专业人士的独立全球软件提供商。Style Analytics之前被称为Style Research,拥有超过20年的因子分析经验,为30个国家的280多家投资机构提供服务。
量化投资与机器学习微信公众号
2018/10/25
6500
【中国市场】2018第二季度因子表现,我都惊呆了!
中国版四因子模型,加入情绪指标,6不6?
股票投资组合的收益率由何种因素决定?这个经典的问题,驱使着一代又一代的金融大师们,持续地对股票市场进行研究。最早的资本资产定价模型(CAPM模型)其实在1961年就有了雏形。
量化投资与机器学习微信公众号
2019/05/16
2.9K0
中国版四因子模型,加入情绪指标,6不6?
探寻量化Alpha:产业链提纯因子
量化策略中超额收益alpha的来源可以简单分为两部分(不考虑网下打新):pure alpha+风险风格收益。pure alpha,包括量价因子、基本面因子等,能够带来稳定的超额收益;风险风格收益由风险因子贡献,包括市场因子、市值因子、行业因子、成长因子等,收益的波动性非常大。
量化投资与机器学习微信公众号
2023/09/05
6360
探寻量化Alpha:产业链提纯因子
拒绝误杀!更有效的因子测试方法
在测试因子时,一般会对因子进行排序,并使用传统资产定价模型(如Fama因子模型)对Top组与Bottom组的收益差进行回归分析,如果显著产生了Fama模型不可解释的收益,就说明这个因子有效。
量化投资与机器学习微信公众号
2023/12/20
5050
拒绝误杀!更有效的因子测试方法
Man Group最新:动态风险管理在股票投资组合中的应用
今天公众号为大家分享一篇Man Group最新的研究文章,干货满满!重点在第四节~
量化投资与机器学习微信公众号
2020/12/08
1.3K0
Man Group最新:动态风险管理在股票投资组合中的应用
基于 RNN、LSTM 的股票多因子预测模型
前言 在机器学习如何应用到量化投资的系列文章中,今天我们专门来介绍一篇来自国信证券的研究报告,来从券商角度分析这个问题。 对于最直接的问题:能否利用神经网络,要机器自己识别 K 线图,自己做出判断,本篇推文的内容无法给出肯定的答案,但也不能否定其可能性,回答它需要更为深入、更为复杂的神经网络。本篇推文的目的是利用深度神经网络中的 RNN 的一些基本结果,对多因子模型进行尝试,以检验深度神经网络在多因子、投资领域的适用性,使得投资者能够对神经网络有 更为实践的理解,并能够在投资领域有所运用。 RNN简介 R
量化投资与机器学习微信公众号
2018/01/29
8.7K0
基于 RNN、LSTM 的股票多因子预测模型
多因子模型之因子(信号)测试平台----因子值的处理(二)
        我们知道,一个因子值的处理大致分为三个步骤,去极值、标准化、中性化,上次我们对因子值进行了去极值和标准化,这一次,我们主要讲一讲中性化,也就是neut。
钱塘小甲子
2019/01/28
1.4K0
多模型融合权重如何训练_单因子模型
本篇文章有别于传统的多因子研究,我们并未将重点放在阿尔法因子的挖掘上,而是通过对股票组合的权重优化计算,找到了在市值中性、行业中性、风格因子中性约束下的最优投资组合,以及验证得到的组合权重是否满足了约束条件。
全栈程序员站长
2022/11/08
1.1K0
多模型融合权重如何训练_单因子模型
浅谈指数增强
在说指数增强之前,首先要说明什么是指数。指数在各个领域中都广为应用,是一种重要的参考指标,比如衡量经济发展水平的GDP指数、反映消费水平/通胀水平的CPI指数、反映股票市场价格水平的价格指数等等。都是将大量个体的指标通过某种规则进行合成,用来反映整体的情况。
量化小白
2019/05/13
1.7K0
浅谈指数增强
相关推荐
是否需要对因子进行『行业中性化』处理?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验