这篇文章主要围绕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的查询效率)
- 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 做些存储层的事情。目前主要用在 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 查询:
- BasicDBObject q = new BasicDBObject();
- BasicDBObject in = new BasicDBObject();
- void createQ(Integer[] ids) {
- q.put("id", in);
- in.put("$in", ids);
- }
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 未连接?
我试图在本地连接我的 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)
我真的浪费了 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 自启动的配置文件中
[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 -> 它从您的系统中丢失
我想要一个用于 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
图像或我自己的自定义图像来运行它。
自定义图像构建为:
FROM PHP:8.0-apache
RUN apt-get update -y && apt-get upgrade -y && apt-get install git libssl-dev -y
RUN pecl install mongodb && docker-PHP-ext-enable mongodb
RUN echo "extension=mongodb.so" >> /usr/local/etc/PHP/PHP.ini
copY --from=composer /usr/bin/composer /usr/bin/composer
EXPOSE 80 443
docker-compose.yml
,使用我上面的自定义图片,是:
version: ''2''
services:
PHP:
image: redswitch/PHP-mongodb:8.0-1.9.0-3
container_name: PHP
volumes:
- ./html:/var/www/html
restart: always
environment:
- VIRTUAL_HOST=www.domain.com
- LETSENCRYPT_HOST=www.domain.com
- LETSENCRYPT_EMAIL=admin@domain.com
- "TZ=Europe/London"
ports:
- 80
expose:
- 80
restart: unless-stopped
composer:
image: composer:2.0
command: ["composer","install"]
volumes:
- ./html:/app
networks:
default:
external:
name: Nginx-proxy-net
在 ./html
的位置是 composer.json
:
{
"require": {
"mongodb/mongodb": "^1.9.0-alpha1","vlucas/PHPdotenv": "^5.3.0"
}
}
我尝试了不同的最低版本,例如 ^1.8.0
、^1.9.0
和以上。这会根据 composer.json
文件中指定的版本提供相同错误消息的差异。
composer
容器按预期启动和停止。这是容器的日志:
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 -> 它从您的系统中丢失的相关信息,请在本站查询。
本文标签: