【发布时间】:2012-04-04 08:35:56
【问题描述】:
我有一个 MySQL 数据库,其中包含几个(准确地说是五个)大表。它本质上是一个基于星型拓扑的数据仓库。表大小范围从 700GB(事实表)到 1GB,整个数据库高达 1 TB。现在,我的任务是在这些表上运行分析,甚至可能包括连接。 在这个数据库上的一个简单的分析查询可以是“查找每个州的吸烟者数量并按降序显示”这个要求可以转换为一个简单的查询,如
select state, count(smokingStatus) as smokers
from abc
having smokingstatus='current smoker'
group by state....
此查询(以及许多其他相同性质的查询)在此数据库上执行需要大量时间,所用时间约为数十小时。
该数据库还大量用于插入,这意味着每隔几分钟就会添加数千行。
在这种情况下,我该如何解决这个查询问题? 我看过 Cassandra,它似乎很容易实现,但我不确定在数据库上运行分析查询是否会那么容易,尤其是当我必须使用“where 子句和 group by constructor”时
还研究了 Hadoop,但我不确定如何实现 RDBMS 类型查询。我不太确定我是否想立即投资购买至少三台机器用于名称节点、动物园管理员和数据节点!最重要的是,我们公司更喜欢基于 Windows 的解决方案。
我还考虑过在更简单的汇总表中预先计算所有数据,但这限制了我运行不同类型查询的能力。
还有其他想法可以实现吗?
编辑
下面是mysql环境设置
1) 主从设置 2) 插入/更新的主控 3) slave 用于读取和运行存储过程 4)所有表都是innodb,每个表都有文件 5) string 和 int 列的索引。
预先计算值是一种选择,但由于对这种临时聚合值的要求不断变化。
【问题讨论】:
-
tens of hours?我的天啊!您是否在表上有适当的索引来执行这些查询? -
@MostyMostacho 是的,我已经创建了索引,您可能会建议将它们加载到内存中,但我的索引本身几乎是 200GB,因此也无法将其加载到内存中。我们还能做什么?
-
尝试编写更好的查询。利用索引。如果不成功,将 MySQL 数据加载到 RedShift 中,然后聚合。
标签: mysql hadoop cassandra analytics