我有一个包含300列和大约10亿行数据的表。我需要以非常快的响应时间查询这些数据(我做了SQL并最终得到了不满意的用户)。我去年开始研究并尝试过cassandra,mongoDB,Olap和SQL Server。我对它们中的任何一个都没有运气,我承认如果不加注意,现在情况会有所不同,但我别无选择,只能在这里问一下。有SQL背景我需要在SQL中做这个显而易见的原因。
我有三台服务器,每台都有
有关硬件,数据库解决方案的任何建议吗?如果这没有任何意义,请原谅我。
谢谢!
编辑1 :我在id
列上有一个PK,每列都有一个非聚集索引。查询很简单 - 几个AND / OR的组合:
Select count(*)
from tbl
where (col1 = value1 AND col2 in (value1, value2) AND...)
and (col1 = value1 OR col2 in (value1, value2) OR...)
编辑2 :该表包含消费者数据名称,地址,州,电子邮件等。除了上面列出的解决方案之外,我尝试将它们拆分并并行查询。
编辑3 :我希望一次有3到4个用户使用该网站。
答案 0 :(得分:2)
这可能会作为软件请求问题关闭......但有三个选项和评论:
评论 - 300列宽,10亿+深是一个混乱的表...你会想要一个ETL过程读取这个表并稍微规范化结构(想想数据仓库......事实和维度表)。任何请求汇总数据的报告都可以让这些聚合每晚运行并保存...如果相同的聚合反复运行,则可以在非工作时间通过聚合来节省时间和资源。
说,有三个'高容量'数据库是为数十亿行设计的(可能更多,但我不是那么认识它们。只有SQL,不会为你进入nosql):
Vertica(惠普提供) - 这将很容易在现有硬件上运行。它是一个列存储数据库,其工作方式与标准数据库完全不同。基数的逻辑真的让Vertica飞行......非常聪明的解决方案,我认为我推荐的最便宜。
Netezza(IBM的产品) - 这是您可以购买的设备(独立机器)。他们将FPGA(基本上是处理器)放在每个物理硬盘驱动器上......有点蛮力的方法。不足之处是你在这里买得很辛苦,而不仅仅是在现有机器上安装。
Exadata(Oracle的产品) - Oracles替代Netezza ......同样的理论,在硬件中使用暴力以及一些处理器逻辑来提高访问速度。这里的警告是,一旦您使用Oracle,您就与Oracle合作......期望机器的成本每年翻倍(关注“终身成本”而不仅仅是安装成本)。经过长时间的评估后,我选择了Vertica ...柱状数据库的逻辑解决方案吸引了我使用大量硬件解决方案。做空间查询(lat / lon查找)能够查看40亿条记录并找出我正在搜索的点是否在该纬度/经度范围内...大约2-3秒来搜索所有40亿条中的项目行。此外,缺少定义索引是一个很好的奖励(柱状数据库样式是自我索引)
编辑: 我去了上面三个中的每一个的供应商...我建议做同样的事情,这些家伙会shmooze ya到没有尽头^^
答案 1 :(得分:0)
我建议使用固态硬盘来提高性能。磁盘IOPS是数据库性能的重要因素。
答案 2 :(得分:0)
老实说,你的答案可能不在于SQL。您遗漏的一个细节是您希望在SQL数据库上加载的负载。 SQL不是分布式生物,因此您只能扩展服务器硬件以尝试满足您的需求。
幸运的是,有一些扩展选项可供选择,但这会违背您保留SQL的要求。您可以考虑使用缓存层来释放SQL服务器上的一些压力,或者甚至可以使用缓存来查询是否使用智能缓存解决方案。在SQL之上添加缓存层的好处是可以扩展缓存以处理增加的负载。由于它的内存特性,缓存也将非常快。我建议至少考虑一个缓存层,看看它是否符合你的需求。
由于您已经查看了Cassandra和MongoDB,您可能已经注意到其他一些类似的产品。以下是一些缓存选项:
ElasticSearch(可能不适合您的需要)
编辑1 :
我很好奇你是否已经确定了你的瓶颈(CPU,内存,网络,SQL的限制)?另外,您能否详细说明运行查询所需的时间 - 它们需要多长时间以及您需要/需要多长时间?另外,你的行对象有多大(以字节/千字节为单位)?
无论哪种方式,您仍然可以从使用某种缓存中受益,无论是SQL-level cache还是顶部的其他层(如前所述)。我担心的主要问题是在内存中存储十亿个缓存对象;您可能必须实现LRU缓存或类似。
另一个选项可能是将查询和响应缓存到SQL数据库。根据您的标准,这可能是更好的选择;然而,记忆仍然值得关注。