GVKun编程网logo

Mongodb vs Mysql 查询性能比较(mongodb和mysql的查询效率)

6

这篇文章主要围绕MongodbvsMysql查询性能比较和mongodb和mysql的查询效率展开,旨在为您提供一份详细的参考资料。我们将全面介绍MongodbvsMysql查询性能比较的优缺点,解答

这篇文章主要围绕Mongodb vs Mysql 查询性能比较mongodb和mysql的查询效率展开,旨在为您提供一份详细的参考资料。我们将全面介绍Mongodb vs Mysql 查询性能比较的优缺点,解答mongodb和mysql的查询效率的相关问题,同时也会为您带来11-【MongoDB 入门教程】MongoDB 原子性和事务、ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?、Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失的实用方法。

本文目录一览:

Mongodb vs Mysql 查询性能比较(mongodb和mysql的查询效率)

Mongodb vs Mysql 查询性能比较(mongodb和mysql的查询效率)

最近想用 Mongodb 做些存储层的事情。目前主要用在 id 查询或 ids 查询(如 mysql 的 in 查询)。新的方案能否上线还要看性能。现在把 mongodb 与 mysql 来对比下。

环境:同一台机器,装有 mongodb 1.4, mysql;内存 4g;两个数据库都只有 id 的唯一搜索;数据量 120w 左右,5w 个查询。对它们进行 id 或 ids 查询。

  mongodb mysql
total time avg time/per query total time avg time/per query
1 id/per query 11954ms, 00:11,954 0ms, 00,0 78613ms, 00:1:18,613 1ms, 00,1
10 id/per query 35885ms, 00:35,885 0ms, 00,0 107274ms, 00:1:47,274 2ms, 00,2
20 id/per query 63714ms, 00:1:3,714 1ms, 00,1 186398ms, 00:3:6,398 3ms, 00,3
5 thread, 20 id/per query - 5ms, 00,5 - 11ms, 00,11
10 thread, 20 id/per query - 10ms, 00,10 - 22ms, 00,22

 

从上表看:

每次查一个 id 的查询,在基本相同条件下 mongodb 速度是 mysql 的 7 倍。

每次查多个 id (10/20)的查询,mongodb 比 mysql 快 2 倍。

多线程下查多个 id,mongodb 比 mysql 快 1 倍。

从上面的测试来看:主要用在 id 查询或 ids 查询的应用中 mongodb 要优越 mysql。

在插入这些数据的时候,mongodb 更加快于 mysql,插入120w 到 mongodb 用 83159ms, ->00:1:23,159 就够了。mysql 有几十分钟。

当我在实际应用中(kw 级数据量),使用 mongodb 速度没有 mysql 好。原因可能有,mysql 的机器好,mongodb 使用不够得当。继续调整和优化程序吧……

附 mongodb 的 in 查询:

  1. BasicDBObject q = new BasicDBObject();  
  2. BasicDBObject in = new BasicDBObject();  
  3.   
  4. void createQ(Integer[] ids) {  
  5.     q.put("id", in);  
  6.     in.put("$in", ids);  

11-【MongoDB 入门教程】MongoDB 原子性和事务

11-【MongoDB 入门教程】MongoDB 原子性和事务

在 MongoDB 中,写操作的原子性是在 document 级别上的,即使修改的是文档中的内嵌部分,写锁的级别也是 document 上。

当一个写操作要修改多个文档,每个文档的修改是原子性的。整个的写操作并不是原子性的,它可能和其他写操作产生交织。然而你可以使用 $isolated 隔离操作符来限制写操作,让它不与其他写操作交织。 不隔离性能更高,但是会产生数据的不确定性,隔离写操作,事务性更好。MongoDB 把这个级别完全由用户控制。

隔离写操作

MongoDB 使用 $isolated 操作符来隔离写操作。如果一个写操作要更新多个文档,它能防止其他进程与本次写操作交错。直到这个写操作完成,其他进程才能写。

但是,$isolated 算不上一个事务,如果在写的过程中发生错误,MongoDB 并不会回滚已经写的数据。$isolated 也不能在分片集群上工作。

特性:

  • 隔离不支持分片集群
  • 不支持 “all-or-nothing” 特性
  • MongoDB2.2 版本后 $isolated 被替换成 $atomic

类事务语法

MongoDB 并不支持关系型数据库中的那种事务特性,为了性能着想,它把这个特性交给程序员去实现。这就是 MongoDB 官方所讲的 Two Phase Commits 两阶段提交。这个技术虽然在一定程度上能保证数据最终的一致性,但是应用程序还是可能会读到提交或者回滚过程中的中间数据。对于这个技术如果有兴趣可以读一读原文。

#并发控制#

并发控制允许多个应用层程序同时访问数据库,而不引起数据不一致或冲突。

MongoDB 中提到两种技术来解决这个问题。第一种是唯一索引,第二种是叫 Update if Current

用唯一索引来防止多个进程重复插入或者更新导致的重复的值。 Update if Current 意思是说在更新数据的时候,在更新条件里给定一个期望的值(这个值是先查询出来的),用来防止在更新之前其他进程已经将此值更新。看一个例子:

var myDocument = db.products.findOne( { sku: "abc123" } );

if ( myDocument ) {
   var oldQuantity = myDocument.quantity;
   var oldReordered = myDocument.reordered;

   var results = db.products.update(
      {
        _id: myDocument._id,
        quantity: oldQuantity,
        reordered: oldReordered
      },
      {
        $inc: { quantity: 50 },
        $set: { reordered: true }
      }
   )

   if ( results.hasWriteError() ) {
      print( "unexpected error updating document: " + tojson(results) );
   }
   else if ( results.nMatched === 0 ) {
      print( "No matching document for " +
             "{ _id: "+ myDocument._id.toString() +
             ", quantity: " + oldQuantity +
             ", reordered: " + oldReordered
             + " } "
      );
   }
}

同样的,在 findAndModify () 函数中:

db.people.findAndModify({
    query: { name: "Andy" },
    sort: { rating: 1 },
    update: { $inc: { score: 1 } },
    upsert: true
})

如果有多个进程同时调用此函数,这些进程都完成了查询阶段,如果 name 字段上没有唯一索引,upsert 阶段的操作,多个进程可能都会执行。导致写入重复的文档。

ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接

ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接

如何解决ArgumentException:MongoDB + Unity2D 中的无效关键字 ''mongodb+srv://test:test@HOST'' - Live MongoDB 未连接?

我试图在本地连接我的 Live MongoDB 数据库,但在我使用外部字符串而不是 localhost 时出错

我使用:

  • MongoDB 数据库 v4.0.x(使用 mongoDB 的免费集群)
  • Unity 2020.3.13

如果我使用 localhost,即使所有的插入、更新、删除查询都能正常工作,这段代码也能正常工作

using UnityEngine;
using UnityEngine.UI;
using MongoDB.Bson;
using MongoDB.Driver;
using System.Collections;
using UnityEngine.Networking;
using MongoDB.Driver.Builders;
using UnityEngine.SceneManagement;
using System;
using Newtonsoft.Json ;

public class Login_Screen : MonoBehavIoUr {

public InputField usernameedit;
public InputField passwordone;
public Button loginButton;


  void start(){
    string connectionString = "mongodb://localhost:27017";
    var client = new MongoClient(connectionString);
    var server = client.GetServer();
    var database = server.GetDatabase("admin");
    var playercollection = database.GetCollection<BsonDocument>("users");
  }
}

但是我用于 LIVE 数据库调用的相同内容,然后导致以下错误。甚至连不上。

string connectionString = "mongodb+srv://testUsername:testPassword@testClustor.mongodb.net?retryWrites=true&w=majority";

错误信息如下:

ArgumentException: Invalid keyword ''mongodb+srv://testusername:testpassword@xyz.xxx.mongodb.net/admin1?w''. MongoDB.Driver.MongoConnectionStringBuilder.set_Item (System.String keyword,System.Object value) (at <6da29fc855c44d33ad78b3e27475ff27>:0) System.Data.Common.DbConnectionStringBuilder.set_ConnectionString (System.String value) (at <290425a50ff84a639f8c060e2d4530f6>:0) MongoDB.Driver.MongoConnectionStringBuilder..ctor (System.String connectionString) (at <6da29fc855c44d33ad78b3e27475ff27>:0) MongoDB.Driver.MongoClient.ParseConnectionString (System.String connectionString) (at <6da29fc855c44d33ad78b3e27475ff27>:0) MongoDB.Driver.MongoClient..ctor (System.String connectionString) (at <6da29fc855c44d33ad78b3e27475ff27>:0) Login_Screen.DoLogin () (at Assets/Script/Login_Screen.cs:61) UnityEngine.Events.InvokableCall.Invoke () (at <24599fe2776145d58ab771516c063d56>:0) UnityEngine.Events.UnityEvent.Invoke () (at <24599fe2776145d58ab771516c063d56>:0) UnityEngine.UI.Button.Press () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:68) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:110) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler,UnityEngine.EventSystems.BaseEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target,UnityEngine.EventSystems.BaseEventData eventData,UnityEngine.EventSystems.ExecuteEvents+EventFunction1[T1] functor) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:262) UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:385)

enter image description here

我真的浪费了 2 天的时间来寻找解决方案,请任何人帮助我。提前致谢

解决方法

我遇到了同样的问题。检查您的 db 和 db 用户的设置 - 确保它们可以从外部 IP 访问。

我像这样修改了我的连接字符串:

 private readonly Dictionary<string,string> _config = new Dictionary<string,string>()
        {
            {"dbUser","xxxxxx"},{"dbName","YourDbName"},{"password","xxxxxxxxxxxxx"}
        };

        public IMongoDatabase CreateInstance()
        {
            var client = new MongoClient($"mongodb+srv://{_config["dbUser"]}:{HttpUtility.UrlEncode(_config["password"])}@pocdata.0u29g.mongodb.net/{HttpUtility.UrlEncode(_config["dbName"])}?retryWrites=true&w=majority");
            return client.GetDatabase(_config["dbName"]);
        }

我只是使用公共方法连接到数据库,但这不是强制性的 - 您可以直接替换值 - 只需对密码和数据库名称进行 url 编码

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#Restart=on-failure
#RestartPreventExitStatus=1
#PrivateTmp=false

这里的

[Service]

User=mysql

Group=mysql,

user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?还是其他呢?

Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失

Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失

如何解决Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失

我想要一个用于 PHP 的运行 Docker 容器,它可以与 MongoDB Atlas 数据库进行远程交互。

我已经硬编码并手动修复了自定义 Docker 映像以使 MongoDB 扩展正常工作。现在在扩展它以包含 vlucas/PHPdotenv composer 包时遇到问题。研究其他位置,似乎还有其他方法可以运行单独的 composer 容器并映射相关驱动器:

https://hackernoon.com/get-composer-to-run-on-docker-container-a-how-to-guide-y86g36z7

但是我无法使用 PHP:8.0-apache 图像或我自己的自定义图像来运行它。

自定义图像构建为:

  1. FROM PHP:8.0-apache
  2. RUN apt-get update -y && apt-get upgrade -y && apt-get install git libssl-dev -y
  3. RUN pecl install mongodb && docker-PHP-ext-enable mongodb
  4. RUN echo "extension=mongodb.so" >> /usr/local/etc/PHP/PHP.ini
  5. copY --from=composer /usr/bin/composer /usr/bin/composer
  6. EXPOSE 80 443

docker-compose.yml,使用我上面的自定义图片,是:

  1. version: ''2''
  2. services:
  3. PHP:
  4. image: redswitch/PHP-mongodb:8.0-1.9.0-3
  5. container_name: PHP
  6. volumes:
  7. - ./html:/var/www/html
  8. restart: always
  9. environment:
  10. - VIRTUAL_HOST=www.domain.com
  11. - LETSENCRYPT_HOST=www.domain.com
  12. - LETSENCRYPT_EMAIL=admin@domain.com
  13. - "TZ=Europe/London"
  14. ports:
  15. - 80
  16. expose:
  17. - 80
  18. restart: unless-stopped
  19. composer:
  20. image: composer:2.0
  21. command: ["composer","install"]
  22. volumes:
  23. - ./html:/app
  24. networks:
  25. default:
  26. external:
  27. name: Nginx-proxy-net

./html 的位置是 composer.json

  1. {
  2. "require": {
  3. "mongodb/mongodb": "^1.9.0-alpha1","vlucas/PHPdotenv": "^5.3.0"
  4. }
  5. }

我尝试了不同的最低版本,例如 ^1.8.0^1.9.0 和以上。这会根据 composer.json 文件中指定的版本提供相同错误消息的差异。

composer 容器按预期启动和停止。这是容器的日志:

  1. No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.,Loading composer repositories with package information,Updating dependencies,Your requirements Could not be resolved to an installable set of packages.,Problem 1,- Root composer.json requires mongodb/mongodb ^1.9.0-alpha1 -> satisfiable by mongodb/mongodb[1.9.0-alpha1].,- mongodb/mongodb 1.9.0-alpha1 requires ext-mongodb ^1.10.0 -> it is missing from your system. Install or enable PHP''s mongodb extension.,To enable extensions,verify that they are enabled in your .ini files:,- /usr/local/etc/PHP/PHP-cli.ini,- /usr/local/etc/PHP/conf.d/docker-PHP-ext-sodium.ini,- /usr/local/etc/PHP/conf.d/docker-PHP-ext-zip.ini,You can also run `PHP --ini` inside terminal to see which files are used by PHP in CLI mode.,

使用 PHP 调用检查 PHPinfo() 容器,我可以看到 MongoDB 扩展 v1.9.0 已启用,加载的配置文件和附加配置位于:

  • /usr/local/etc/PHP/PHP.ini
  • /usr/local/etc/PHP/conf.d/docker-PHP-ext-mongodb.ini,/usr/local/etc/PHP/conf.d/docker-PHP-ext-sodium.ini立>

我该如何解决这个问题?

这是部署 PHP+MongoDB+Composer+PHPDotEnv 的正确方式吗?

我们今天的关于Mongodb vs Mysql 查询性能比较mongodb和mysql的查询效率的分享已经告一段落,感谢您的关注,如果您想了解更多关于11-【MongoDB 入门教程】MongoDB 原子性和事务、ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?、Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失的相关信息,请在本站查询。

本文标签: