【发布时间】:2012-03-30 22:51:27
【问题描述】:
我对 MongoDb 感到非常兴奋,并且最近一直在测试它。我在 MySQL 中有一个名为 posts 的表,其中大约 2000 万条记录仅在一个名为“id”的字段上建立索引。
我想将速度与 MongoDB 进行比较,我进行了一项测试,该测试将从我们庞大的数据库中随机获取并打印 15 条记录。我为 mysql 和 MongoDB 分别运行了大约 1,000 次查询,我很惊讶我没有注意到速度上有很大差异。也许 MongoDB 快 1.1 倍。这非常令人失望。有什么我做错了吗?我知道我的测试并不完美,但在阅读繁重的杂务方面,MySQL 与 MongoDb 相当。
注意:
- 我有双核 +(2 线程)i7 cpu 和 4GB 内存
- 我在 MySQL 上有 20 个分区,每个分区有 100 万条记录
用于测试 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;
}
?>
测试 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;
}
?>
【问题讨论】:
-
我不是 DBA,所以这是评论而非答案,但在 MySQL 和 MongoDB 之间进行选择时,速度不应成为主要考虑因素。诸如无模式与模式(即您的数据模式需要多久更改一次)和规模缩放(即,将数据分片以使典型的读取仅需要来自一台服务器的数据的难易程度)之类的事情对于选择更为重要像这样。
-
阅读速度怎样才能更快?它从机械设备中读取。与 MySQL 相同。这取决于设备本身的速度,你不能通过代码使用一些奇怪的魔法来突破硬件的限制。
-
@ImranOmarBukhsh,确实如此。我的观点来自不建议为了改变而改变 - 并提出一种可以利用现有技术提高性能的方法
:) -
这个问题让我想起了这个:mongodb-is-web-scale.com
-
人们误以为他们会选择一个或另一个。你的厨房里需要微波炉和烤箱。你不能说我只会使用一个或另一个。两个系统的用例不同。如果您的应用程序的一部分需要 ACID,则使用 RDBMS,如果不关心一致性和约束并且您的实体可以存储为一体(集合),则使用 MongoDB。您最终将使用混合系统,关键是决定将什么存储在哪里。
标签: mysql performance mongodb