Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与MySQL相比,MongoDB/NoSQL允许更快的聚合(MapReduce),两者的根本区别是什么_Mongodb_Mongodb Query_Nosql - Fatal编程技术网

与MySQL相比,MongoDB/NoSQL允许更快的聚合(MapReduce),两者的根本区别是什么

与MySQL相比,MongoDB/NoSQL允许更快的聚合(MapReduce),两者的根本区别是什么,mongodb,mongodb-query,nosql,Mongodb,Mongodb Query,Nosql,问候 我有以下问题。我有一个包含大量行的表,我需要搜索这些行,然后根据许多参数对搜索结果进行分组。假设这张桌子是空的 id, big_text, price, country, field1, field2, ..., fieldX 我们运行这样的请求 SELECT .... WHERE [use FULLTEXT index to MATCH() big_text] AND [use some random clauses that anyway render indexes usele

问候

我有以下问题。我有一个包含大量行的表,我需要搜索这些行,然后根据许多参数对搜索结果进行分组。假设这张桌子是空的

id, big_text, price, country, field1, field2, ..., fieldX
我们运行这样的请求

SELECT .... WHERE 
[use FULLTEXT index to MATCH() big_text] AND 
[use some random clauses that anyway render indexes useless, 
like: country IN (1,2,65,69) and price<100]
这是我所需要的一个简化案例,手头的实际任务问题更大,例如,有时第一个结果查询也会执行自己的分组查询。这种功能的例子就是这个网站 (左侧的搜索结果和过滤器)

我已经对MySQL的功能做了深入的研究,现在我完全不认为MySQL可以做到这一点。粗略地说,MySQL表只是HDD上的一堆行,索引是这些表的小版本,按索引字段排序并指向实际行。这当然是一个超级简单化的问题,但问题是我根本不知道如何解决这个问题,也就是说,如何使用多个索引,能够快速分组(当查询到达分组索引时,由于范围搜索和其他原因,完全没有用)。我知道MySQL(或类似的数据库)有很多有用的东西,比如索引合并、松散的索引扫描等等,但这还不够——上面的查询仍然需要永远执行

有人告诉我,NoSQL可以解决这个问题,它使用了一些全新的存储和处理数据的方法,包括聚合任务。我想知道的是它是如何做到这一点的一些快速的图解说明。我的意思是,我只是想快速地看一眼,这样我就能真正看到它是这样做的,因为目前我根本不明白怎么可能做到这一点。我的意思是,数据仍然是数据,必须放在内存中,索引仍然是索引,有其所有的限制。如果这确实可行,那么我将开始详细研究NoSQL

另外,请不要告诉我去读一本关于NoSQL的大书。我已经为MySQL做了这项工作,结果发现它在我的情况下不可用:),所以我想在得到一本大书之前对这项技术有一些初步的了解


谢谢

基本上有4种类型的“NoSQL”,但四种类型中有三种非常相似,可以在其上编写SQL语法(包括MongoDB和它疯狂的查询语法[我说,尽管Javascript是我最喜欢的语言之一])

键值存储 这些是像Redis这样的简单NoSQL系统,基本上是一个非常奇特的哈希表。你有一个你想以后得到的值,所以你给它分配了一个键并把它塞进数据库,你一次只能查询一个对象,而且只能通过一个键

你肯定不想要这个

文件存储 这比键值存储高了一步,也是大多数人在说NoSQL(比如MongoDB)时谈论的话题

基本上,这些是具有层次结构的对象(如XML文件、JSON文件和计算机科学中任何其他类型的树结构),但树上不同节点的值可以被索引。与传统的基于行的SQL数据库相比,它们在查找时具有更高的“速度”,因为它们牺牲了连接时的性能

如果您从一个包含大量列的表中查找MySQL数据库中的数据(假设它不是一个视图/虚拟表),并且假设它为您的查询建立了正确的索引(这可能是您真正的问题,这里),像MongoDB这样的文档数据库不会比MySQL有任何大的好处,因此,您可能不想仅仅因为这个原因而迁移过来

柱状存储器 这些数据库最像SQL数据库。事实上,一些(比如Sybase)实现了SQL语法,而另一些(Cassandra)则没有。它们将数据存储在列而不是行中,因此添加和更新成本很高,但大多数查询成本很低,因为每个列本质上都是隐式索引的

但是,如果您的查询不能使用索引,那么使用列式存储也不会比使用常规SQL数据库更好

图形存储 图形数据库扩展到SQL之外。任何可以用图论表示的东西,包括键值、文档数据库和SQL数据库,都可以用图形数据库表示,比如neo4j

图形数据库使连接尽可能便宜(相对于文档数据库),但它们必须这样做,因为即使是简单的“行”查询也需要许多连接才能检索

表扫描类型的查询可能比标准SQL数据库慢,因为检索数据需要所有额外的连接(数据以不连接的方式存储)

那么解决办法是什么呢? 你可能已经注意到我没有准确地回答你的问题。我不是说“你完成了”,但真正的问题是如何执行查询

  • 你绝对确定你不能更好地索引你的数据吗?有些东西可以提高特定查询的性能。Microsoft的SQL Server具有适用于您提供的示例的
  • 与SQL数据库相比,大多数NoSQL数据库的真正优势是Map Reduce——具体来说,它集成了一种以高速运行的完整图灵完整语言,可以编写查询约束。可以编写查询函数来快速“失败”不匹配的查询,或者在满足“优先级”要求的记录上快速返回并获得成功,而在SQL中执行同样的操作则有点麻烦
  • 然而,最后,您试图解决的确切问题是:带有可选过滤参数的文本搜索,通常被称为
    搜索引擎
    ,并且有非常专门的引擎来处理这个特定的问题。我建议执行这些查询

    基本上,转储文本字段、“过滤器”字段和主键
    (results) GROUP BY field1
    (results) GROUP BY field2
    (results) GROUP BY field3
    (results) GROUP BY field4