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

问题描述 投票:3回答:1

问候!

我有以下问题。我有一个包含大量行的表,我需要搜索,然后按许多参数对搜索结果进行分组。我们说这个表是

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]

我们将其显示为搜索结果,然后我们需要获取这些搜索结果并将其分组为多个字段以生成搜索过滤器

(results) GROUP BY field1
(results) GROUP BY field2
(results) GROUP BY field3
(results) GROUP BY field4

这是我需要的简化案例,手头的实际任务更有问题,例如有时第一个结果查询也会有自己的GROUP BY。此类功能的例子是这个网站http://www.indeed.com/q-sales-jobs.html(搜索结果加左边的过滤器)

我已经完成并且仍在深入研究MySQL的功能,在这一点上我完全不认为这在MySQL中是可行的。粗略地说,MySQL表只是位于HDD上的一堆行,索引是这些表的微小版本,按索引字段排序并指向实际行。这当然是一个超级过度简化,但重点是我看不出怎么可能解决这个问题,即如何使用多个索引,能够快速完成GROUP BY-s(到查询到达GROUP时)由于范围搜索和其他因素,BY索引完全没用。我知道MySQL(或类似的数据库)有各种有用的东西,如索引合并,松散的索引扫描等等,但这根本不够 - 上面的查询仍然需要永远执行。

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

PS。请不要告诉我去读一本关于NoSQL的大书。我已经为MySQL做了这个,只是为了发现它在我的情况下不可用:)所以我想在获得一本大书之前对该技术有一些初步的了解。

谢谢!

mongodb mongodb-query nosql
1个回答
12
投票

基本上有4种类型的“NoSQL”,但是这四种中的三种实际上足够相似,可以在它上面编写SQL语法(包括MongoDB和它疯狂的查询语法[我说即使Javascript是我的一个)最喜欢的语言])。

键值存储

这些是简单的NoSQL系统,比如Redis,基本上是一个非常奇特的哈希表。您有一个以后想要获得的值,因此您可以为其分配一个键并将其填充到数据库中,您一次只能查询一个对象并且只能通过一个键查询。

你绝对不希望这样。

文件存储

这比Key-Value Storage高出一步,是大多数人在谈到NoSQL(例如MongoDB)时所谈论的。

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

如果你从一个包含大量列的表中查找MySQL数据库中的数据(假设它不是一个视图/虚拟表),并假设你已经为你的查询正确索引(这可能是你真正的问题,这里)像MongoDB这样的文档数据库不会给你任何超过MySQL的Big-O好处,所以你可能不想因为这个原因而迁移。

柱状存储

这些是最像SQL数据库。事实上,有些(如Sybase)实现SQL语法,而其他(Cassandra)则不实现。它们将数据存储在列而不是行中,因此添加和更新都很昂贵,但大多数查询都很便宜,因为每列基本上都是隐式索引的。

但是,如果您的查询无法使用索引,那么使用Columnar Store比使用常规SQL数据库更好。

图存储

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

图形数据库使连接尽可能便宜(而不是文档数据库)来执行此操作,但它们必须这样做,因为即使是简单的“行”查询也需要许多连接来检索。

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

那么解决方案是什么?

您可能已经注意到我没有完全回答您的问题。我不是说“你已经完成了”,但真正的问题是如何执行查询。

  1. 您是否绝对确定无法更好地索引数据?像Multiple Column Keys这样的东西可以改善你的特定查询的性能。 Microsoft的SQL Server有一个适用于您提供的示例的full text key typePostgreSQL can emulate it
  2. 大多数NoSQL数据库对SQL数据库的真正优势是Map-Reduce - 特别是,可以写入查询约束的高速运行的完整图灵完备语言的集成。查询功能可以快速写入“失败” out“不匹配的查询或快速返回成功满足”优先级“要求的记录,而在SQL中执行相同操作则有点麻烦。

然而,最后,您要解决的确切问题是:使用可选过滤参数进行文本搜索,通常称为search engine,并且有非常专业的引擎来处理此特定问题。我建议使用Apache Solr来执行这些查询。

基本上,将文本字段,“过滤器”字段和表的主键转储到Solr中,让它索引文本字段,通过它运行查询,如果之后需要完整记录,则查询SQL数据库对于您从Solr获得的特定索引。它使用了更多的内存,需要第二个过程,但这可能最符合您的需求。

为什么所有这些文字都能得到这个答案?

因为你问题的标题与你的问题内容没有任何关系,所以我回答了这两个问题。 :)

© www.soinside.com 2019 - 2024. All rights reserved.