代码之家  ›  专栏  ›  技术社区  ›  jocull

MongoDB、复杂查询和性能

  •  6
  • jocull  · 技术社区  · 14 年前

    背后的故事

    SQLite惊人的强大,并且支持一些非常复杂的SQL查询。不过,我在看MongoDB,它会为我的用户的海量数据提供一个小NoSQL。 每个用户 能够 生成60000行或更多行。 随着用户数量的不断增长,我开始担心未来的性能。

    复杂性

    我对MongoDB和其他NoSQL数据库的担心是,它们在支持哪种查询操作方面似乎更加有限。如果您只需要简单明了的批量查询,这没什么大不了的,但是我必须做一些更复杂的连接和筛选(联合、区分大小写、分组、偶尔的连接等)。

    我的示例查询试图按艺术家选择曲目列表。主要的问题是这些艺术家的名字 可能不匹配

    -

    性能

    我在本地机器上创建了两个新的数据库。一个用于MongoDB,一个用于MySQL。我正在用PHP与他们交谈,因为这是我的最终结果必须使用的。每个数据库只有大约9000条记录,所以在这一点上并不是很大。

    #1-MongoDB:~14ms,结果不正确

    $query = array('artist' => 'A Day to Remember');
    $cursor = $collection->find($query);
    foreach ($cursor as $row) {
        echo $row['artist'] . ' - ' . $row['album'] . ' - #'. $row['track'] . ' ' . $row['title'] . "\r\n";
    }
    

    #2-MongoDB:~170ms,正确结果

    $query = array('$where' => "this.artist.toLowerCase() == 'a day to remember'");
    $cursor = $collection->find($query);
    foreach ($cursor as $row) {
        echo $row['artist'] . ' - ' . $row['album'] . ' - #'. $row['track'] . ' ' . $row['title'] . "\r\n";
    }
    

    $sql = "select artist, album, track, title from radio_files where lower(artist) = 'a day to remember'";
    $stmt = $mysqldb->prepare($sql);
    $stmt->execute();
    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        echo $row['artist'] . ' - ' . $row['album'] . ' - #'. $row['track'] . ' ' . $row['title'] . "\r\n";
    }
    

    -

    讨论

    看看Javascript查询引擎是如何杀死它的 . 这里甚至没有太多的记录需要处理:整个数据库中只有不到9000条。

    我的主要问题是 :什么样的产品最终会更可靠、性能更好,并且仍然适合我的需求?随着我的项目的用户群的增长,我希望离开我有限的服务器,得到一些专门的东西。通过我自己的MySQL安装,我应该能够用很少的关系数据和适当的索引维护自己的大型MyISAM表。

    但是数据库中有数百万条记录,MySQL的性能会怎样呢?鼓励对此进行思考、评论和一般性讨论。谢谢!

    3 回复  |  直到 7 年前
        1
  •  8
  •   Maxence    14 年前

    尝试使用正则表达式:

    $regex = new MongoRegex('/^' . preg_quote('a day to remember'). '$/i');
    $query = array('artist' => $regex);
    $cursor = $collection->find($query);
    
        2
  •  6
  •   TTT    14 年前

    Mongodb有丰富的查询语言(与其他nosql系统相比),您可以为每一列(组合)建立索引。不过,我确实发现mapreduce很慢,但只要不使用mapreduce就可以解决问题,那就没问题了。

        3
  •  4
  •   Daniel Vassallo    14 年前

    不同的NoSQL解决方案之间的差异远大于传统SQL数据库的差异,但是MongoDB实际上是其中最丰富的特性之一,特别是在查询复杂性方面。

    但是,您不应该盲目地使用NoSQL解决方案,因为您希望每个用户有60000行。MySQL和其他流行的关系数据库可以毫无问题地处理数十亿行。

    关系数据库具有许多重要的特性( ACID

    我目前正在为每个用户提供他们自己的SQLite数据库,以绕过提供商的1GB MySQL数据库限制。

    你也可以考虑更换供应商。应用这些限制的主机最终可能会以其他方式限制您。

    推荐文章