Mysql:如何实时运行大量分析查询

3
我正在运行一个使用MySQL数据库的CRM应用程序。 我的应用程序在MySQL中产生了大量数据。 现在我想提供一个报告部分,其中管理员可以查看实时报告,他们应该能够实时筛选。 基本上我希望我的数据能够在尽可能快的时间内实时切片和切块。
我已经使用MySQL和PHP实现了报告。 但是现在由于数据太多,查询需要太长时间,页面无法加载。 在阅读一些内容后,我遇到了一些术语,例如Nosql、MongoDB、Cassandra、OLAP、Hadoop等,但我不确定该选择哪个。 是否有一种机制可以将我的数据从MySQL转移到Nosql,并可以在其上运行报告查询并为客户提供服务,同时保留我的MySQL数据库?

链接的相关性:http://stackoverflow.com/q/2476280/544342 - WAF
好奇一下,使用 nosql 数据库报告速度比原来的 mysql 快多少呢?看起来不太可能会快那么多。 - jeroen
我没有数据来说明使用nosql数据库相比原始mysql报告速度提高了多少,但是nosql肯定是可扩展和快速的未来选择。 - Pradeep Jaiswar
3个回答

8
无论您用哪种数据库/数据存储技术进行报告,都需要设计它以有效地提取所需信息。从MySQL切换到MongoDB或其他可扩展的键/值存储系统来改善性能,就像通过建造铁路来解决行人交通堵塞一样。这将需要大量的工作来帮助情况。我建议您先尝试在MySQL中使事情变得更好。
首先,您需要仔细查看报告系统中哪些SQL查询会引起问题。您可以通过添加索引或进行其他重构来优化其性能。这应该是您的第一步。 MySQL有一个慢查询日志。看一下吧。
其次,您可以向MySQL添加资源(RAM、更快的磁盘等),并且您可能可以调整它以获得更高的性能。有一本名为《高性能MySQL》的书提供了一种可靠的方法。
第三,许多需要向其繁忙应用程序添加报告功能的人使用MySQL复制。也就是说,他们配置一个或两个从MySQL服务器接受所有数据副本的服务器。

http://dev.mysql.com/doc/refman/5.5/en/replication-howto.html

他们随后使用从服务器来运行报告查询。从服务器通常比主服务器慢几秒钟或几分钟(也就是说,它们略微过时)。但这通常足以给用户一种实时报告的错觉。
请注意,如果您使用MongoDB或其他技术,您还必须复制您的数据。

谢谢Ollie!! 我明白你的意思了。你的意思是通过添加主从模型、MySQL集群和调优来从MySQL本身中获得更好和最佳的性能。我同意你的观点。一旦我获得更多的客户,我的应用程序数据将会快速增长。那么,我的上述MySQL建议仍然适用吗?还是我需要稍后转向NoSQL(我仍然需要设计它以有效地提取所需信息)?那为什么现在不做呢? - Pradeep Jaiswar
我忘记说了多少次:MongoDB不是键值存储。 - Sammaye
此外,我不知道复制是如何影响性能的,请记住,许多人已经学到了,在从服务器上运行查询并不能真正帮助提高性能,特别是对于MongoDB来说,因为MongoDB的结果不需要IO或物理结果集,所以只要您有足够的内存容量,它就非常轻巧。许多MySQL和MongoDB用户发现,在从服务器上运行查询会导致过于复杂和性能差的旧数据。 - Sammaye
@Sammaye,您建议我选择什么?因为我的PHP与MySQL报告不起作用? - Pradeep Jaiswar
@OllieJones。谢谢!我有一个票务和在线聊天应用程序。可以通过邮件、聊天、移动和离线等方式打开票务。您可以说是360客户服务。随着我们添加客户,票务数量大幅增加。有代理商处理这些票务。我们的报告基于这些票务和代理商的测量。 - Pradeep Jaiswar
显示剩余3条评论

1

我会提供一个链接供您阅读,其中实际上提供了某些用例: http://www.mongodb.com/use-cases/real-time-analytics 但是我将为更传统的MongoDB设置发言。

我已经使用过MySQL和MongoDB进行分析目的,我发现MongoDB更适合,如果不需要一点点黑客技巧来使其正常工作。

当涉及到检索分析数据时,MongoDB的好处在于它不需要IO /内存每次写出单独的结果集。这使得对副本集的单个成员进行读取非常可扩展,因为您只需将分析集合添加到工作集(即内存)中,并使用批处理响应直接从中提供服务(这是驱动程序的默认实现)。

因此,对于MongoDB而言,复制很少在读/写方面具有优势,实际上在MySQL中我也发现它并没有优势。如果确实如此,那么您正在执行无法扩展的错误查询; 在这种情况下,您将在数据库服务器上安装memcache,然后,看,您正在以NoSQL方式从内存中提供过期数据...嗨呀,我猜。

好的,我们已经确定了一些基本想法; 现在是时候谈论那个黑客了。为了从MongoDB获取最佳速度,并且由于它没有JOINs,您需要扁平化数据,以便您的一侧甚至不需要任何结果集。

有许多策略可以实现这一点,但我要在这里提到的是:http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/ 预聚合报告。由于它本质上与逻辑上拆分表以使查询更快,更轻松地运行在大型表上的方式相同,因此此方法在SQL技术中也很有效。

您需要做的是将您的分析数据拆分为每天或每月(或两者),然后以非规范化的方式跨越这些范围聚合您的数据,基本上是一行。

之后,您可以直接从集合中显示报告,而无需任何结果集,从而进行一些非常快速的查询。

稍后,您可以添加一个映射减少步骤来创建更好的分析,但迄今为止我还没有需要完成完整的基于视频的分析。

这应该让您开始了解。


1

TiDB可能是一个很好的选择https://en.pingcap.com/tidb/,它兼容MySQL,在实时分析方面表现出色,并且可以通过binlog复制MySQL中的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接