MongoDB 中的索引应保持在最低限度。或者我在阅读后尝试this . ..我也摆弄过这个 nice preso有一些很棒的提示。
我有一个问题,让我设计一个例子:
I need to store data about goods stored in locations which are indexed by catalog.
我有几个位置。在每个位置我可以有很多 cargo 。每种商品都可以有货,也可以没有。每个三元组都在给定的目录中找到。
CATALOG_X: { { location: "...", good: "...", stock_or_not: 0|1 },
{ location: "...", good: "...", stock_or_not: 0|1 },
...
}
例如:
CATALOG1: NEWYORK - BREAD - 0 // 0 is out of stock
CATALOG2: LOSANGELES - WATER - 1 // 1 is in stock
一个并发症:我通过仅按目录的查询获取这些状态。喜欢:
getMeStatusOfCatalog("CATALOG1") -> { "NEWYORK - BREAD" : 0 } // location - good : instock
但是:重要的一点是,getMeStatusOfCatalog 可能只是停止给我一个特定商品的答案,所以如果我再也看不到 BREAD,我仍然需要设置0 该特定目录的 BREAD。这意味着在我的“写入”操作中,我需要根据目录(in_catalog 下方)获取所有过去的“活跃”商品。
我在应用程序中的主要业务目标是我需要显示每个位置的分割,例如:
Location 1 (New York) has: bread which is out of stock, etc
Location 2 (Los Angeles) has: water which is fine, etc
如果我将我的 _id 设置为 "LOCATION:GOOD" 那么我可以查询为 /^LOCATION/ 并获得所有的东西我需要 * .总体:
{
_id: "LOCATION:GOOD"
catalog: "..."
in_stock: 0|1
in_catalog: 0|1
}
但是,我对基于getMeStatusOfCatalog 的数据插入/更新感到困扰。我将如何获取所有需要更新的文档?
我无法将它添加到之前讨论的 _id 中,因为我将无法再使用 left-anchored-regex。我需要使 catalog 成为索引(复合的,唯一的)吗?喜欢:
{
_id: "LOCATION:GOOD:CATALOG" // unique by itself, repeating catalog to ensure unique, used for fast reads
_catalog: "..." // unique by itself, used for fast writes
in_stock: 0|1
in_catalog: 0|1
}
createIndex( { "_id": 1, "_catalog": 1 }, { unique: true } )
通过这种方式,我牺牲了空间(双索引)来获得更快的查询。
您将如何设计它以同时具有高性能的读取和写入?
最佳答案
插入和查询性能之间总是存在权衡。添加索引以优化查询时,您将影响插入率。
但是,除非您的用例是网络规模的事务或事件处理系统(每秒数千个事务),否则您不太可能注意到由于一个或两个复合索引而导致的插入性能问题。您可能会使您的解决方案更加复杂,以解决您没有的问题。
事实上,您提出的解决方案无意中增加了插入问题的可能性!
诚然,如果可能,您应该使用_id 字段。然而,在实现时,默认的 _id 字段有两个重要的属性:
当 MongoDB 执行插入或更新时,它会根据 _id 的值将文档放置在磁盘上(此行为因存储引擎而异 - MMapv1 尤其容易受到影响)。在您的实现中,您正在失去这第二个属性,因此完全有可能在规模上,单个插入或更新可能会强制 MongoDB 重新组织磁盘上的数据,这将非常慢。
如果您仔细阅读您引用的演示文稿,您会发现他们为 _id 选择的键保留了这两个属性!
对于您的应用程序,我会单独保留 _id,而是在复合索引中包括目录、位置和 good 作为文档属性。是的,它会略微增加存储需求并在不知不觉中影响插入性能,但在您注意到性能问题之前,您的数据集将非常大。
我还认为您使用正则表达式搜索人为地影响了查询性能。虽然有此功能,但 MongoDB 并不是为全文搜索引擎而构建的。如果您需要类似的东西(类似 Google 的查询),请考虑使用 ElasticSearch 或相关技术。
最后,如果您确实需要 Web 规模的插入性能,同时保持查询性能,您可能会发现自己在其他地方做出权衡。例如,您可以插入或更新没有索引的文档,然后使用 oplog 同步“只读”索引版本。有一些真正创新的架构以这种方式结合了 MongoDB 和 ElasticSearch,提供了出色的性能(例如:http://blog.mpayetta.com/elasticsearch/mongodb/2016/08/04/full-text-indexing-with-elastic-search-and-mongodb/
关于MongoDB 索引确定以最大化性能和最小化索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49881837/
我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)
有没有一种简单的方法可以判断ruby脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免
我发现自己需要这个。假设cart是一个包含用户列表的模型。defindex_of_itemcart.users.each_with_indexdo|u,i|ifu==current_userreturniendend获取此类关联索引的更简单方法是什么? 最佳答案 indexArray上的方法与您的index_of_item方法相同,例如cart.users.index(current_user)返回数组中第一个对象的索引==给obj。如果未找到匹配项,则返回nil。 关于ruby-on-
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night
我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0
我想查找字符串的结尾是否与单独字符串的开头重叠。例如,如果我有这两个字符串:string_1='Peoplesaynothingisimpossible,butI'string_2='butIdonothingeveryday.'如何找到string_1末尾的“butI”部分与string_2开头相同?我可以编写一个方法来遍历这两个字符串,但我希望得到一个包含我错过的Ruby字符串方法或Ruby习惯用法的答案。 最佳答案 将MARKER设置为一些从未出现在您的string_1和string_2中的字符串。有一些方法可以动态地做到这一
我正在寻找一个用ruby演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent