- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应该很简单的问题,但是我对此感到困惑-也许我对MongoDB中的复合索引有误解。
为了重现此问题,我创建了一个简单的集合,其中包含500000个条目和六个字段,每个字段都有一个随机数。在mongo
终端中,我生成了这样的集合:
for(i = 0; i < 500000; i++){
db.test.save({a: Math.random(), b: Math.random(), c: Math.random(), d: Math.random(), e: Math.random() })
}
t1 = new Date().getTime()
db.test.count({a : {$gt: 0.5}, b : {$gt: 0.5}, c : {$gt: 0.5}, d : {$gt: 0.5}, e : {$gt: 0.5} })
t2 = new Date().getTime()
t2-t1
=> 335ms
db.test.ensureIndex({a: 1, b:1 ,c:1 ,d:1, e:1})
t1 = new Date().getTime()
db.test.count({a : {$gt: 0.5}, b : {$gt: 0.5}, c : {$gt: 0.5}, d : {$gt: 0.5}, e : {$gt: 0.5} })
t2 = new Date().getTime()
t2-t1
=> 762ms
db.test.dropIndexes()
删除索引可使查询再次运行得更快,回到〜350ms。
explain()
检查查询显示在添加索引之前使用了
BasicCursor
。添加索引后,将使用
BtreeCursor
并具有预期的
indexBounds
。
> mongo --version
MongoDB shell version: 2.6.3
最佳答案
您的示例的问题基本上是,在这种情况下,为了有效利用索引,数据实际上“太随机”了。结果是预料之中的,因为在索引中如何遍历索引没有多少“顺序”,并且考虑到在索引文档中的每个字段时,索引大小将比文档本身大一些。
为了更好地表示“现实世界”的情况,您可以查看相关数据的50/50比例来进行搜索。这里有一个更优化的生成器形式:
var samples = [{ "a": "a", "b": "a" },{ "a": "b", "b": "b" }];
for ( var x = 0; x < 5; x++ ) {
samples.forEach(function(s) {
var batch = [];
for(i = 0; i < 10000; i++){
batch.push( s );
}
db.test.insert(batch);
});
}
db.test.find({ "a": 1, "b": 1 }).explain()
db.test.ensureIndex({ "a": 1, "b": 1 })
100ms
下且主要在
90ms
标记附近完成。当您添加一些投影以将统计信息强制为“仅索引”时,这也会变得更加有趣:
db.test.find({ "a": 1, "b": 1 },{ "_id", "a": 1, "b": 1 }).explain()
"indexOnly": true
,但是工作集的大小可能足够小以适合内存,因此由于“额外的工作”投影,您会发现性能略有下降。 “ 田野。现在,带有索引的平均值在硬件上大约为
110ms
。但是当您删除索引时:
db.test.dropIndexes()
170ms
。这更清楚地显示了针对指数收益的预测开销。
db.test.ensureIndex({ "a": 1, "b": 1, "c": 1, "d": 1, "e": 1 })
135ms
使用索引,当然也可以使用相同的
170ms
而不使用索引。现在,如果您再返回到原始查询表单:
db.test.find({ "a": 1, "b": 1, "c": 1, "d":1, "e": 1}).explain()
135ms
标记附近,而未索引的查询正在跳过
185ms
标记。
var batch = []
for( i = 0; i < 500000; i++){
batch.push({
"a": Math.round(Math.random()*100)/100,
"b": Math.round(Math.random()*100)/100,
"c": Math.round(Math.random()*100)/100,
"d": Math.round(Math.random()*100)/100,
"e": Math.round(Math.random()*100)/100
});
if ( batch.length % 10000 == 0 ) {
db.test.insert( batch );
batch = [];
}
}
590ms
左右。当您添加相同的索引时,查询将在
360ms
中完成。
db.test.find({ "a": {"$gt": 0.5}, "b": {"$gt": 0.5} }).explain()
490ms
处出现。将索引仅添加到“ a”和“ b”
db.test.ensureIndex({ "a": 1, "b": 1 })
300ms
,因此仍要快得多。
485ms
:
db.test.find({ "a": {"$gt": 0.5}, "b": {"$gt": 0.5} }).explain()
385ms
运行。虽然比我们的完整查询要快,但速度慢,但是考虑到索引包含所有字段和条件。但是,如果您仅对必填字段进行了投影更改:
db.test.find(
{ "a": {"$gt": 0.5}, "b": {"$gt": 0.5} },
{ "_id": 0, "a": 1, "b": 1 }
).explain()
650ms
,并增加了投影的开销。这表明有效的索引实际上确实会对结果产生很大的影响。
关于performance - 非常奇怪-添加复合索引会使查询变慢(MongoDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24399354/
我已经在谷歌上搜索这个问题一段时间了,但我还没有找到有效的解决方案。 问题是 SSH 登录到我的服务器突然变得很慢。我可以看到身份验证需要大约 10 秒才能继续,这是我的 ssh 详细日志: Open
我正在使用 AVPlayer 在我的项目中播放在线视频。视频播放良好。现在我想减少/增加视频的 fps。以下是我正在使用的代码: self.asset = [AVAsset assetWithURL:
在 Raspberry Pi 上运行两个使用 python gpio 引脚的程序时,一个变慢。一种是磁传感器,另一种是温湿度传感器。后者是放慢速度的。它不是每 2 秒打印一次温度,而是每 5 到 10
我从 Redis 向我的应用程序提供一个 json,然后我对其进行解码和循环。 这是我从 Redis 提供的 json 的样子: [ { "titel": "test 1",
Ejabberd 版本:19.9.0 在发送 OMEMO 消息时(使用 websockets),例如
我们有相当大的代码库(150 多个项目、400000 多行 Java 代码、一些 Groovy 和 Gradle 代码、一些 Perl 代码、一些 XML、大量 JSP 等)。我设法在 Spring
我在一个网站上工作,您可以在其中创建 svg 艺术品,这意味着您可以动态添加元素、缩放、颜色并移动它们。 问题是,当你开始在他们身上施加阴影时,一切都会开始变慢。对于这个的现场演示,this是我正在开
有没有办法分析 Vim 插件? 当我打开一个大的 .py 时,我的 MacVim 变得越来越慢。我知道我可以取消选择所有插件并逐一重新选择以检查哪个插件是罪魁祸首,但是有没有更快的方法? 我的 dot
我正在构建一个JavaFX应用程序。我知道它使用反射,并且反射可能不如我在代码中构建 UI 时那么快。 所以, 如何设计我的 Controller 以使由反射引起的开销尽可能小? 带/不带 @FXML
我对 UITableViewCell 进行了子类化显示从 1 到 70 的数字。 在每个单元格中,我都在检查中奖号码并检查他们的背景。问题是,经过几次滚动后,tableview 变得非常缓慢,甚至无法
如果我想group_by 和filter 那些在数据集中有任何NA 或factor 值的,我想在 dplyr 中使用 any 函数,但发现它对 NAs 或 factor 运行缓慢(但不是为了寻找任何数
我有一个问题。在我的解决方案中,我需要将数千个数据插入数据库。我正在使用批处理准备语句在一个请求中插入多行。在我调用插入几次之后, hibernate 变得更慢了。 我猜它会在我提交后检查数据库是否有
我从 json url 获取数据,但是当我想加载图像时,速度非常慢! class NewsTableViewController: UITableViewController { var id
我有一个相当简单的托管 Realm 对象 RealmAlertItem由一些字符串和 float 组成。我有一个函数 showAlertNotification()随后被调用(从网络外部触发)并且它依
请参阅下面的表格结构。 CREATE TABLE `oarc` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `zID` int(11) NOT N
IntelliJ 慢得像爬行。键之间没有 1-2 个延迟几乎无法打字。我已经更新了堆大小。我在我的 Macbook Pro 上运行大约 2GB RAM。自从它一直在放缓。我已经增加了堆大小,但无济于事
我的 Web 应用程序遇到了性能问题。发现瓶颈是db。应用程序在具有 4 个 CPU 和 2GB RAM 的 LAMP 服务器 (VPS) 上运行。 将新记录插入数据库(包含大约 100.000 条记
我有关于自定义 DispatchQueue 的问题。 我创建了一个队列,并将其用作captureOutput:方法的队列。这是一个代码片段: //At the file header private
我是一名移动 QA。现在我们有一个关于网络响应和 UI 渲染之间的竞争条件的问题。我们猜测如果 UI 渲染比网络响应慢,那么它就会崩溃。 我们已经尝试通过使用 Charles 的本地 map 功能来加
我在 firefox 中遇到了一些奇怪的行为,我正在构建一个单页作品集,作为一名平面设计师,编码一直很困难。我想平滑地控制导航,然后向所有元素添加缩放(最初设计为 1920x1080 全屏)。讲师扔了
我是一名优秀的程序员,十分优秀!