与具有 10M 记录的 MySQL 相比,MongoDB 非常慢

2024-01-02

我有一个负载相当高的项目,在 MySQL 上运行,有大约 10M 条记录,每秒大约有 500 个请求。数据相当独特,缓存命中率只有3%左右。每行大约有 10 个字段,其中 2 个已建立索引。我的查询 99% 使用这两个索引字段来请求。

我决定尝试 NoSQL,MongoDB 是理所当然的。移动数据非常简单,只需使用简单的定制脚本即可。数据库架构保持完全相同,我复制了相同的两个索引字段,它们仍然负责 90% 的请求。然后我决定尝试一下,结果非常震惊:MongoDB 回答查询的速度非常非常慢。响应率从每秒 5 到 10 个请求不等,而 mysql 的响应率为 500 个。

有什么想法为什么会发生这种情况吗?正常吗?在这种特殊情况下(10M 记录,大量唯一请求,缓存命中率低),我是否应该期望 MongoDb 优于 Mysql?我感觉我漏掉了一点。

UPDATE有一些规格

我测试的服务器是四核 Xeon 和 4GB 内存

MySQL 表是(字段名称重命名):

  CREATE TABLE `table` (
  `recordid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `var1` varchar(200) DEFAULT NULL,
  `var2` char(32) DEFAULT NULL,
  `var3` bigint(20) unsigned DEFAULT NULL,
  `var4` smallint(5) unsigned DEFAULT NULL,
  `var5` datetime DEFAULT NULL,
  `var6` int(10) unsigned NOT NULL,
  `var7` int(10) unsigned NOT NULL,
  `var8` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`recordid`),
  UNIQUE KEY `recordid_UNIQUE` (`recordid`),
  KEY `keyvar7` (`var7`),
  KEY `keyvar6` (`var6`)

典型的查询是: 从表中选择 var2、var4、var5、var6,其中 var7=xxx 且 var6=yyy

通过比较使用索引字段和非索引字段的查询,我手动验证了 MongoDB 是否正确复制了相同的索引。

UPDATE2MongoDB .getIndexes() 回复

  > db.table.getIndexes();
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "table.table",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
            "var6" : 1
        },
        "ns" : "table.table",
        "name" : "var6_1"
    },
    {
        "v" : 1,
        "key" : {
            "var7" : 1
        },
        "ns" : "table.table",
        "name" : "var7_1"
    }
]

MongoDB 并不是一个神奇的查询加速器。您的网站不会仅仅因为您切换到 mongo 就承受 10 倍的负载。

从你的数字来看,我怀疑资源已经饱和。 MySQL 当然可以做到超过 500 QPS。

你知道你的瓶颈是什么吗?我敢打赌,您的 RAM 比所需的少得多,必须从磁盘获取数据,并且磁盘会饱和。在这一点上,没有任何数据库技术可以帮助你,除非你得到更多的铁(或删除一些数据)。

至于mongo性能较差,不具体情况很难说。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与具有 10M 记录的 MySQL 相比,MongoDB 非常慢 的相关文章

随机推荐

  • CodeIgniter - 奇怪的输出问题

    我发现脚本输出存在一个非常奇怪的问题 有时我会在输出开始之前得到一个四位十六进制代码 并在输出末尾得到一个零 例如 2fc3 0 十六进制数根据请求的 uri 和 或内容而变化 我没有使用缓存并且输出压缩已关闭 我在几个项目中看到了这个问题
  • 无法在 Ubuntu Windows 上的 bash 上连接到 Docker 守护进程

    我能够安装 docker docker compose 和 docker machine 但是当我尝试跑步时 root DESKTOP 51NFMIM docker ps Cannot connect to the Docker daemo
  • (对象)是一个“字段”,但使用方式类似于“类型”

    我的智能感知给了我错误 ClassLibrary1 GetTimeZone myWorldTime 是一个 字段 但使用方式类似于 类型 知道我做错了什么吗 Object Browser for the class1 https i sta
  • 如何获得唯一确定给定双精度的“最短”BigDecimal

    基本上 我很好奇如何掌握new BigDecimal Double toString d 无需经历创建字符串的过程 The 的文档Double toString http download oracle com javase 6 docs
  • 使用 ASCII 和基数 128 混淆字符串

    假设一个字符串是一个数字系统 其中每个事物 可以是字符 DEL 或任何 ASCII 事物 根据该 ASCII 都有一个对应的数字table http web eecs utk edu pham ascii table jpg 在Python
  • 在 OpenCL 内核中实现小型查找表的最佳方法是什么

    在我的内核中 需要对一个小查找表 只有 8 个 32 位整数 进行大量随机访问 每个内核都有一个唯一的查找表 下面是内核的简化版本 用于说明如何使用查找表 kernel void some kernel global uint global
  • 对 iCalUId 进行过滤返回空数组

    以下查询返回空数组https graph microsoft com v1 0 me events filter iCalUId eq
  • Eclipse - 更新/安装新软件非常慢

    这个问题之前已经描述过 但建议的解决方案都不适合我 这就是问题 我已经安装了最新版本的 Eclipse Luna 4 4 1 如果我想进行更新或安装新软件 则需要很长时间才能完成 很多小时 如果我将所需的软件下载到本地存档 更新站点并从那里
  • 我可以访问 Lotus Notes 的数据库吗?

    这是我第一次使用 Lotus Notes 所以我只知道如何使用它 我也是一名开发人员 所以我对数据库有所了解 目前 我收到将用户添加到 AD 帐户或从 AD 禁用用户甚至修改其在 AD 中的属性的请求 这些请求是通过 Lotus Notes
  • 带有测试容器的 BitBucket 管道无法正常工作

    当尝试使用测试容器运行 bitbucket 管道时 我遇到此错误 无法启动容器 java lang IllegalStateException Container 没有正确启动 没有其他问题 但也许与 Binds 有关 日志 HostCon
  • 解析错误,为什么? :( [复制]

    这个问题在这里已经有答案了 我正在为学校项目摆弄一些东西 遇到了一个我自己无法解决的问题 所以这是我的问题 为什么我会收到此错误 Parse error syntax error unexpected output2 T VARIABLE
  • 微服务和 Spring Security OAuth2

    我已经在另一个项目中运行了 OAuth2 授权服务器 现在我需要使用 OAuth2 保护几个简单的 spring boot Rest servers 但我正在寻找Spring文档 http projects spring io spring
  • 使用 SMO 编写部分数据内容的脚本(仅匹配 WHERE 子句的行)

    我使用 SMO 用 SQL Server 数据库的数据填充 SQL Compact 数据库 这是我实际使用的代码 foreach Table l tblCurrent in l dbDatabase Tables if l tblCurre
  • 安装 Tensorflow 时出现问题——不是 CUDA/CuDNN 问题

    我最近开始使用 Tensorflow 但安装时遇到问题 每次我尝试导入它时都会收到以下错误 gt gt gt import tensorflow as tf Traceback most recent call last File C Us
  • 如何使用 numpy/scipy 处理丢失的数据?

    我在数据清理中最常处理的事情之一就是缺失值 R 使用其 NA 缺失数据标签很好地处理了这个问题 在Python中 看来我必须处理屏蔽数组 这似乎是设置的一个主要难题 而且似乎没有很好的文档记录 关于用 Python 简化这个过程有什么建议吗
  • 在asp.net服务器端代码中?

    我有这个代码 string s royi string val 5 我也有一个label
  • HTML/CSS 嵌套菜单下拉菜单

    我不明白如何为导航栏菜单创建嵌套下拉菜单 我想使用按钮和 div 而不是列表 链接 引导程序 我在这里构建了一些我认为正确的东西 但当然我无法让它工作 有人可以帮我让下拉菜单和嵌套下拉菜单正常工作吗 dropdown background
  • 使用 .NET 4.6.2 中的 HttpClientFactory

    我有一个 NET 4 6 2 控制台应用程序 使用简单注入器 我需要调用 HTTP 服务 直接使用 HttpClient 遇到问题后 我尝试使用 HttpClientFactory https github com aspnet HttpC
  • 链接器如何解析 C 中多重定义的全局符号

    我的教科书上是这么说的 函数和初始化的全局变量获得强符号 未初始化的全局变量获得弱符号 给定一个强符号和多个弱符号 选择强符号 所以我创建了两个文件来查看 file1 c int number int main int argc char
  • 与具有 10M 记录的 MySQL 相比,MongoDB 非常慢

    我有一个负载相当高的项目 在 MySQL 上运行 有大约 10M 条记录 每秒大约有 500 个请求 数据相当独特 缓存命中率只有3 左右 每行大约有 10 个字段 其中 2 个已建立索引 我的查询 99 使用这两个索引字段来请求 我决定尝