Mysql:如何实时运行繁重的分析查询

时间:2014-12-23 13:36:11

标签: php mysql mongodb hadoop nosql

我正在运行一个使用mysql数据库的crm应用程序。我的应用程序在mysql中生成大量数据。现在我想给我的客户一个报告部分,管理员可以在其中查看实时报告,他们应该能够实时过滤。基本上我希望我的数据尽可能快地实时切片和切块。    我已经使用mysql和php实现了报告。但是现在由于数据太多,查询需要花费太多时间而且页面无法加载。经过几次阅读后,我遇到了一些名词,如Nosql,mongoDb,cassandra,OLAP,hadoop等,但我很困惑可以选择。是否有任何机制可以将我的数据从mysql传输到nosql,我可以运行我的报告查询和服务我的客户保持我的mysql数据库原样?

2 个答案:

答案 0 :(得分:6)

您使用哪种数据库/数据存储技术进行报告并不重要:您仍然需要将其设计为有效地提取所需的信息。

通过从MySQL切换到MongoDB或其他可扩展的键/值存储系统之一来提高性能就像通过建设铁路解决行人交通拥堵一样。它需要做很多工作才能帮助解决问题。我建议你先尝试让MySQL的工作更好。

首先,您需要仔细查看报告系统中的哪些SQL查询导致问题。您可以通过添加索引或进行其他重构来优化其性能。这应该是你迈出的第一步。 MySQL的查询日志很慢。看它。

其次,您可以向MySQL添加资源(RAM,更快的磁盘等),并且您可以调整它以获得更高的性能。有一本名为High Performance MySQL的书为这样做提供了一种合理的方法。

第三,许多需要在繁忙的应用程序中添加报告功能的人使用MySQL复制。也就是说,它们配置一个或两个从MySQL服务器以接受来自主服务器的所有数据的副本。

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

然后,他们使用从属服务器或服务器来运行报告查询。奴隶通常在主人后面几秒钟或几分钟(也就是说,他们稍微过时了)。但它通常足以让用户产生实时报道的幻觉。

请注意,如果您使用MongoDB或其他技术,则还必须复制数据。

答案 1 :(得分:1)

我会抛出这个链接供你阅读哪些实际上给出了某些用例:http://www.mongodb.com/use-cases/real-time-analytics但我会代表更传统的MongoDB设置。

我已经将MySQL和MongoDB用于分析目的,我发现MongoDB更适合,如果不需要一点点黑客来使其运行良好。

在检索分析数据方面,MongoDB的优点在于它不需要IO /内存每次都写出单独的结果集。这使得对副本集的单个成员的读取具有极高的可伸缩性,因为您只需将分析集合添加到工作集(也称为内存),并直接使用批处理响应(这是驱动程序的默认实现)。

因此,MongoDB复制很少在读/写方面具有优势,而实际上在MySQL中我发现它也没有。如果它确实那么你正在做错误的查询,无论如何都不会扩展;此时你将memcache安装到你的数据库服务器上,看起来,无论如何你都是以NoSQL的方式从内存中提供过时的数据......呐喊,我猜。

好的,我们有一些基本的想法;是时候谈论那个黑客了。为了从MongoDB中获得最佳速度,并且由于它没有JOIN,您需要展平数据,以便不需要任何结果集。

这有很多策略,但我在这里提到的是:http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/预先汇总的报告。这种方法在SQL技术中也很有效,因为它基本上与逻辑拆分表相同,可以在大型表上更快更轻松地进行查询。

您所做的就是获取分析数据,将其分成每天或每月(或两者)等命名,然后以非规范化方式(基本上是一行)汇总这些范围内的数据。

在此之后,您可以直接从集合中显示报告,而无需使用结果集进行快速查询。

稍后你可以添加一个map reduce步骤来创建更好的分析,但到目前为止我还没有必要,我已经完成了完全基于视频的anlytics而没有这种需要。

这应该让你开始。