Sap*_*Sap 6 mysql analytics hadoop cassandra
我有一个MySQL数据库,有几个(五个准确)巨大的表.它本质上是一个基于星形拓扑的数据仓库.表大小从700GB(事实表)到1GB不等,整个数据库最大可达1TB.现在,我被赋予了在这些表上运行分析的任务,甚至可能包括联接.对这个数据库的一个简单的分析查询可以是"找到每个状态的吸烟者数量并按降序显示"这个要求可以在一个简单的查询中转换,如
select state, count(smokingStatus) as smokers
from abc
having smokingstatus='current smoker'
group by state....
Run Code Online (Sandbox Code Playgroud)
此查询(以及许多其他相同的性质)需要花费大量时间在此数据库上执行,所花费的时间大约为数十小时.
此数据库也大量用于插入,这意味着每隔几分钟就会添加数千行.
在这种情况下,我该如何解决这个查询问题?我查看了Cassandra,它似乎很容易实现,但我不确定在数据库上运行分析查询是否容易,特别是当我必须使用"where子句和group by constru"时
还研究了Hadoop,但我不确定如何实现RDBMS类型查询.我不太确定我是否愿意立即投资为名称节点,zookeeper和数据节点至少购买三台机器!最重要的是我们公司更喜欢基于Windows的解决方案
我还想过在更简单的汇总表中预先计算所有数据,但这限制了我运行不同类型查询的能力.
我还能实施其他任何想法吗?
以下是mysql环境设置
1)主从设置2)主设备用于插入/更新3)从设备用于读取和运行存储过程4)所有表都是innodb,每个表有文件5)字符串以及int列的索引.
预计算值是一种选择,但由于这种特殊聚合值的要求不断变化.
从试图让 MySQL 更好地工作而不是提出一个全新的架构系统的角度来看待这个问题:
首先,验证到底发生了什么。解释导致问题的查询,而不是猜测发生了什么。
话虽如此,我将猜测发生了什么,因为我没有查询计划。我猜测 (a) 你的索引没有被正确使用,并且你得到了一堆可以避免的表扫描,(b) 你的数据库服务器针对 OLTP 进行了调整,而不是分析查询,(c) 在读取时写入数据导致速度大大减慢,(d)使用字符串很糟糕,(e)你有一些低效的查询和可怕的连接(每个人都有一些这样的)。
为了改进事情,我会调查以下内容(大致按此顺序):
检查查询计划,确保正确使用现有索引 - 查看表扫描,确保查询确实有意义。
将分析查询移出 OLTP 系统 - 快速插入和短查询所需的调整与可能读取大部分大型表的查询类型的调整非常不同。这可能意味着拥有另一个仅分析从属设备,具有不同的配置(可能还有表类型 - 我不确定 MySQL 目前的最新技术水平)。
将字符串移出事实表 - 而不是让吸烟状态列包含字符串值(例如)“当前吸烟者”、“最近戒烟”、“戒烟 1 年以上”、“从不吸烟”,而是将这些值推送到另一个表,并在事实表中具有整数键(这也将有助于索引的大小)。
在查询运行时停止更新表 - 如果索引在查询运行时移动,我看不到好的事情发生。(幸运的是)我已经很长时间没有关心 MySQL 复制了,所以我不记得是否可以批量写入分析查询从属设备而不会发生太多戏剧性的事情。
如果到了这一步还没有解决性能问题,那么是时候考虑放弃 MySQL 了。我首先会看看 Infobright - 它是开源的/$$并且基于 MySQL,因此它可能是最容易放入您现有系统的(确保数据进入 Infobright DB,然后将您的分析查询指向 Infobright)服务器,保持系统的其余部分不变,工作已完成),或者如果 Vertica 发布了其社区版。Hadoop+Hive 有很多移动部件 - 它非常酷(并且在简历上很棒),但如果它仅用于系统的分析部分,那么它可能比其他选项需要更多的关注和支持。
| 归档时间: |
|
| 查看次数: |
1488 次 |
| 最近记录: |