Imr*_*hsh 305 mysql performance mongodb
我对MongoDb非常兴奋并且最近一直在测试它.我在MySQL中有一个名为posts的表,大约有2000万条记录仅在名为"id"的字段上编入索引.
我想比较MongoDB的速度,我运行了一个测试,它将从我们庞大的数据库中随机获取和打印15条记录.我为mysql和MongoDB运行了大约1000次查询,我很惊讶我没有注意到速度上的很多差异.也许MongoDB快了1.1倍.这非常令人失望.有什么我做错了吗?我知道我的测试并不完美,但是当涉及阅读密集的杂务时,MySQL与MongoDb相当.
注意:
用于测试MongoDB的示例代码
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_taken = 0;
$tries = 100;
// connect
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$m = new Mongo();
$db = $m->swalif;
$cursor = $db->posts->find(array('id' => array('$in' => get_15_random_numbers())));
foreach ($cursor as $obj)
{
//echo $obj["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000) ;
}
return $numbers;
}
?>
Run Code Online (Sandbox Code Playgroud)
用于测试MySQL的示例代码
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$BASE_PATH = "../src/";
include_once($BASE_PATH . "classes/forumdb.php");
$time_taken = 0;
$tries = 100;
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$db = new AQLDatabase();
$sql = "select * from posts_really_big where id in (".implode(',',get_15_random_numbers()).")";
$result = $db->executeSQL($sql);
while ($row = mysql_fetch_array($result) )
{
//echo $row["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000);
}
return $numbers;
}
?>
Run Code Online (Sandbox Code Playgroud)
Sea*_*lly 620
MongoDB并不神奇地更快.如果您存储相同的数据,以基本相同的方式组织,并以完全相同的方式访问它,那么您真的不应该期望您的结果有很大的不同.毕竟,MySQL和MongoDB都是GPL,所以如果Mongo中有一些神奇的更好的IO代码,那么MySQL团队可以将它合并到他们的代码库中.
人们看到真实世界的MongoDB性能很大程度上是因为MongoDB允许您以不同的方式查询,这对您的工作负载更为明智.
例如,考虑一种以规范化方式持久保存有关复杂实体的大量信息的设计.这可以很容易地使用MySQL(或任何关系数据库)中的几十个表来以正常形式存储数据,需要许多索引来确保表之间的关系完整性.
现在考虑与文档存储相同的设计.如果所有这些相关表都从属于主表(并且它们通常是),那么您可以对数据建模,使整个实体存储在单个文档中.在MongoDB中,您可以将其作为单个文档存储在单个集合中.这是MongoDB开始实现卓越性能的地方.
在MongoDB中,要检索整个实体,您必须执行:
所以b树查找和二进制页面读取.Log(n)+ 1个IO.如果索引可以完全驻留在内存中,那么1 IO.
在具有20个表的MySQL中,您必须执行:
所以mysql的总数,即使假设所有索引都在内存中(由于它们的数量多20倍,因此更难)是大约20个范围查找.
这些范围查找可能包含随机IO - 不同的表肯定会驻留在磁盘上的不同位置,并且实体的同一表中相同范围内的不同行可能不是连续的(取决于实体的实现方式)更新等).
因此,对于此示例,与MongoDB相比,每个逻辑访问的最终计数大约是MySQL的20倍.
这就是MongoDB如何在某些用例中提高性能.
the*_*oid 57
你有并发性,即同时用户?如果你只是直接运行1000次查询,只有一个线程,几乎没有区别.这些引擎太容易了:)
但我强烈建议您构建一个真正的负载测试会话,这意味着在同一时间使用JMeter等注入器与10,20或50个用户,这样您就可以真正看到差异(尝试将此代码嵌入到网页JMeter中)可以查询).
我今天刚刚在一台服务器(以及一个简单的集合/表)上完成了它,结果非常有趣且令人惊讶(与MyISAM引擎和InnoDb引擎相比,MongoDb在写入和读取方面确实更快).
这应该是你的测试的一部分:并发和MySQL引擎.然后,数据/架构设计和应用程序需求当然是超出响应时间的巨大要求.让我知道当你得到结果时,我也需要对此有所了解!
小智 33
资料来源:https://github.com/webcaetano/mongo-mysql
10行
mysql insert: 1702ms
mysql select: 11ms
mongo insert: 47ms
mongo select: 12ms
Run Code Online (Sandbox Code Playgroud)
100行
mysql insert: 8171ms
mysql select: 10ms
mongo insert: 167ms
mongo select: 60ms
Run Code Online (Sandbox Code Playgroud)
1000行
mysql insert: 94813ms (1.58 minutes)
mysql select: 13ms
mongo insert: 1013ms
mongo select: 677ms
Run Code Online (Sandbox Code Playgroud)
10.000行
mysql insert: 924695ms (15.41 minutes)
mysql select: 144ms
mongo insert: 9956ms (9.95 seconds)
mongo select: 4539ms (4.539 seconds)
Run Code Online (Sandbox Code Playgroud)
Gab*_*bow 19
男人,,,答案是你基本上测试PHP而不是数据库.
无论是否注释掉印刷品,都不要费心去迭代结果.有一大块时间.
foreach ($cursor as $obj)
{
//echo $obj["thread_title"] . "<br><Br>";
}
Run Code Online (Sandbox Code Playgroud)
而另一块人正在花费大量的兰特数字.
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000) ;
}
return $numbers;
}
Run Code Online (Sandbox Code Playgroud)
然后是一个主要的差异b/w内爆和进入.
最后这里发生了什么.看起来每次都创建一个连接,因此它测试连接时间加上查询时间.
$m = new Mongo();
Run Code Online (Sandbox Code Playgroud)
VS
$db = new AQLDatabase();
Run Code Online (Sandbox Code Playgroud)
因此,对于剥离爵士乐的基础查询,你的速度提高101%可能会快1000%.
urghhh.
Reo*_*xey 17
https://github.com/reoxey/benchmark
基准
GOLANG1.6和PHP5中MySQL和MongoDB的速度比较
系统用于基准测试:DELL cpu i5第四代1.70Ghz*4 ram 4GB GPU内存2GB
对于INSERT,SELECT,UPDATE,DELETE执行不同行数的RDBMS与NoSQL的速度比较10,100,1000,10000,100000,1000000
用于执行的语言是:PHP5和Google最快的语言GO 1.6
________________________________________________
GOLANG with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 1.195444ms
100 6.075053ms
1000 47.439699ms
10000 483.999809ms
100000 4.707089053s
1000000 49.067407174s
SELECT
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 872.709µs
SELECT & DISPLAY
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 20.717354746s
UPDATE
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 2.309209968s
100000 257.411502ms
10000 26.73954ms
1000 3.483926ms
100 915.17µs
10 650.166µs
DELETE
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 6.065949ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
________________________________________________
GOLANG with MongoDB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 2.067094ms
100 8.841597ms
1000 106.491732ms
10000 998.225023ms
100000 8.98172825s
1000000 1m 29.63203158s
SELECT
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 5.251337439s
FIND & DISPLAY (with index declared)
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 21.540603252s
UPDATE
------------------------------------------------
num of rows time taken
------------------------------------------------
1 1.330954ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
________________________________________________
PHP5 with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 0.0040680000000001s
100 0.011595s
1000 0.049718s
10000 0.457164s
100000 4s
1000000 42s
SELECT
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 <1s
SELECT & DISPLAY
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 20s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
________________________________________________
PHP5 with MongoDB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 0.065744s
100 0.190966s
1000 0.2163s
10000 1s
100000 8s
1000000 78s
FIND
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 <1s
FIND & DISPLAY
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 7s
UPDATE
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 9s
Run Code Online (Sandbox Code Playgroud)
这是一项使用MySQL vs Mongo探索RDBMS vs NoSQL 的小研究,结论与@Sean Reilly的回应一致。简而言之,好处来自设计,而不是一些原始的速度差异。结论在第35-36页:
RDBMS与NoSQL:性能和扩展比较
该项目测试,分析和比较了两种数据库类型的性能和可伸缩性。完成的实验包括运行不同数量和类型的查询,其中一些查询比其他查询更复杂,以分析数据库如何随着增加的负载进行扩展。在这种情况下,最重要的因素是所使用的查询类型,因为MongoDB可以更快地处理更复杂的查询,这主要是由于它的简单模式牺牲了数据重复,这意味着NoSQL数据库可能包含大量数据重复。尽管可以使用直接从RDBMS迁移的模式,但这将消除MongoDB子文档的基础数据表示形式的优点,即在合并表时可以对数据库使用较少的查询。尽管在这些复杂查询中MongoDB在性能上优于MySQL,但当基准测试通过使用嵌套SELECT对MySQL查询建模类似于MongoDB复杂查询时,MySQL的表现最佳,尽管在连接数量较多时,两者的行为类似。基准测试的最后一种查询类型是包含两个JOINS和一个子查询的复杂查询,这表明MongoDB由于使用子文档而具有优于MySQL的优势。此优势是以数据复制为代价的,该数据复制会导致数据库大小增加。如果此类查询在应用程序中很常见,则重要的是考虑NoSQL数据库作为替代方案,同时考虑到由于数据库规模较大而导致的存储和内存大小成本。
归档时间: |
|
查看次数: |
290302 次 |
最近记录: |