与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数据库慢,因为检索数据需要所有额外的连接(数据以不连接的方式存储) 那么解决办法是什么呢? 你可能已经注意到我没有准确地回答你的问题。我不是说“你完成了”,但真正的问题是如何执行查询
搜索引擎
,并且有非常专门的引擎来处理这个特定的问题。我建议执行这些查询
基本上,转储文本字段、“过滤器”字段和主键
(results) GROUP BY field1
(results) GROUP BY field2
(results) GROUP BY field3
(results) GROUP BY field4