我有一个基于 MongoDB 的数据库,里面有大约 10 万到 50 万个文本文档,而且这个集合还在不断增长。系统应支持按文档的不同字段进行查询,例如标题、类别、重要性等
该系统是一个近乎实时的系统,每 5-10 分钟获取一次新文档。
为了提高查询的性能,为文档的每个经常查询的字段(字段类型:小文本、数字、日期)定义一个单独的索引是否是个好主意?或者还有其他提高 MongoDB 查询性能的最佳实践?
最佳答案
您应该根据您试图查找的结果使用/制作索引。 为您在不同时间尝试查找的不同字段设置不同的索引是个好主意。
但请记住,索引会占用您的 RAM。你做索引越多,它就会使用你的 RAM。还要考虑索引的排序,同时进行更好的搜索。
在制定索引策略时,您应该对应用程序的查询有深入的了解。在您构建索引之前,请规划您将运行的查询类型,以便您可以构建引用这些字段的索引。索引会带来性能成本,但对于大型数据集的频繁查询来说,它的成本是值得的。考虑应用程序中每个查询的相对频率以及查询是否证明索引是合理的。
设计索引的最佳总体策略是使用与您将在生产环境中运行的数据集类似的数据集来分析各种索引配置,以查看哪些配置性能最佳。检查为您的集合创建的当前索引以确保它们支持您当前和计划中的查询。如果不再使用索引,请删除该索引。
创建时可以选择的一些策略:
Create Indexes to Support Your Queries 当索引包含查询扫描的所有字段时,索引支持查询。创建支持查询的索引可以大大提高查询性能。
Use Indexes to Sort Query Results 为支持高效查询,请在指定索引字段的顺序和排序顺序时使用此处的策略。
Ensure Indexes Fit in RAM 当您的索引适合 RAM 时,系统可以避免从磁盘读取索引,您可以获得最快的处理速度。
Create Queries that Ensure Selectivity 选择性是查询使用索引缩小结果范围的能力。选择性允许 MongoDB 将索引用于与完成查询相关的大部分工作。
关于performance - MongoDB 索引定义策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036538/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些