【问题标题】:mysql_query equivalent to mongoDBmysql_query 相当于 mongoDB
【发布时间】:2012-05-04 00:25:28
【问题描述】:

我正在尝试编写php benchmark 来比较一些 RDBMS、NewSQL 和 NoSQL。 该脚本只是执行查询并测量执行时间。

对于 mysql-like,我只是使用:

$start = microtime(true);
$result = mysql_query($SQL);
$end = microtime(true);

我没有为我的基准测试获取数据。

但是使用 mongodb-php,函数 find() 返回一个 cursor

$start = microtime(true);
$collection = $this->_db->selectCollection($collection);
$cursor = $collection->find($query);
$end = microtime(true);

$cursor$result 是否等效(时间/数据成本)? 游标不加载数据,我必须迭代游标才能加载数据。这就是为什么要执行时间MySQL 和 mongoDB 之间的查询是如此不同或只是 mongoDB 岩石......

我想知道将我的代码更改为是否更公平:

$start = microtime(true);
$result = mysql_query($SQL);
while ($row = mysql_fetch_row($result)) {}
$end = microtime(true);

$start = microtime(true);
$cursor = $collection->find($query);
foreach ($cursor as $doc) {}
$end = microtime(true);

最后,是不是说每次迭代 mongodb 游标数据都是直接从 mongodb 服务器而不是从计算机内存中获取?

【问题讨论】:

    标签: php mysql mongodb benchmarking nosql


    【解决方案1】:

    Running ->find() 确实只是返回光标。在您获取第一个结果之前,查询不会执行。届时,驱动程序将发出查询。这允许您使用 ->limit() 和 ->skip() 之类的内容来修改光标。所以是的,对结果集进行迭代会更公平。

    是的,遍历 mongoDb 游标,数据是从 MongoDB 服务器获取的。没有像 MySQL 这样的无缓冲查询(两者都允许)。当然,MongoDB 也会将这些数据保存在内存中——尤其是如果您紧接着执行两次。

    【讨论】:

    • 好的,谢谢你是对的。但是你觉得我的做法好吗?还是我没有想到的另一种解决方案?例如:使用 MongoDB::execute ?
    • Execute 不是为了运行查询,只是为了运行一些任意的 javascript。到目前为止,我从来没有使用过它。最好的基准测试是拥有一个真正的应用程序,或者进行插入测试。
    • 是的,在我的示例中,我选择了选择查询。但我的基准测试将在伪真实应用程序上执行许多不同类型的查询(选择、插入、更新等)。但我的问题只是关于选择,因为 mongodb 使用游标。
    猜你喜欢
    • 2014-03-19
    • 2015-05-26
    • 1970-01-01
    • 2011-07-11
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多