Php 云架构堆栈意见-EC2与Azure

Php 云架构堆栈意见-EC2与Azure,php,.net,azure,amazon-ec2,cloud-hosting,Php,.net,Azure,Amazon Ec2,Cloud Hosting,我读过很多关于亚马逊EC2与微软Azure(以及谷歌的应用引擎)利弊的博客和文章。然而,我正在努力决定哪一个更适合我的具体情况 我有一个数据集,可以将其视为以下格式的标准表: [id] [name] [d0] [d1] [d2] .. [d63] --------------------------------------- 0 Name1 0.43 -0.22 0.11 -0.81 1 Name2 0.23 0.65 0.62 0.41 2

我读过很多关于亚马逊EC2微软Azure(以及谷歌的应用引擎)利弊的博客和文章。然而,我正在努力决定哪一个更适合我的具体情况

我有一个数据集,可以将其视为以下格式的标准表:

[id]  [name]  [d0]  [d1]  [d2] .. [d63]
---------------------------------------
0     Name1   0.43 -0.22  0.11   -0.81
1     Name2   0.23  0.65  0.62    0.41
2     Name3  -0.13 -0.23  0.17    0.00
...
N     NameN   0.43 -0.23  0.12    0.01
我最终想做一些事情(尽管我最终选择了堆栈),这相当于一个
sqlselect
语句,类似于:

SELECT name FROM [table] WHERE (d0*QueryParameter1) + (d1*QueryParameter1) +(d2*QueryParameter2) + ... + (dN*QueryParameterN) < 0.5
从[表]中选择名称,其中(d0*QueryParameter1)+(d1*QueryParameter1)+(d2*QueryParameter2)+……+(dN*查询参数)<0.5
其中
QueryParameter1,2,N
是在运行时提供的参数,每次运行查询时都会更改(因此缓存是不可能的)

我主要关心的是查询的速度,因此我想知道哪种云堆栈选项可以提供尽可能快的查询结果

我可以通过多种方式做到这一点:

  • (1) 使用SQLAzure,就像上面的查询一样。我已经尝试过这种方法,由于SQL只提供一个实例,所以查询速度可能会非常慢。我可以启动多个SQL实例并对数据进行切分,但这很快就会变得非常昂贵
  • (2) 使用Azure存储表。博主们声称存储表通常更快,但我的查询需求是否仍然如此
  • (3) 使用EC2并使用MySQL启动多个实例,可能会将切分合并到新实例中(尽管成本增加)
  • (4) 在MongoDB中使用EC2,正如我所读到的,它比
    MySQL
    快。同样,这可能取决于查询的类型
  • (5) 谷歌AppEngine。我不确定GAE将如何处理这种查询结构,但我想这就是我寻求意见的原因
我想找到最佳的堆栈组合来优化我的特定需求(上面的伪
SQL
查询概述)

有人有这方面的经验吗哪个堆栈选项将导致在
WHERE
子句中包含许多数学运算符的最快查询?

干杯,
Brett

目前,SQL Azure和Amazon RDS都不能水平扩展(EC2至少可以垂直扩展),但如果且仅当您的数据可以以仍然可以执行查询的方式进行分区时,SQL Azure即将推出的SQL Federations功能可能值得一看,并有助于做出明智的决策


MongoDB(我非常喜欢)更倾向于面向文档的工作负载,并且可能不是这类工作的最佳解决方案,尽管您的里程可能会有所不同(只要您的大部分工作集都能放入内存,它的速度就非常快)。

问题不在于数学运算符或其数量,问题是它们是参数化的——您实际上是在对列进行加权平均,并在运行时定义权重,因此必须计算操作,而不能推断操作

即使在SQL Server中,此操作也可以并行化(这应该显示在执行计划中),但它不适合使用索引进行搜索优化,而这正是大多数关系数据库真正发挥作用的地方。使用静态权重和索引计算列显然会执行得非常快


因为这个问题很容易并行化,所以您可能希望基于一个原则来研究一些问题。

假设QueryParameter0、QueryParameter1、,QueryParameters都是在运行时提供的,并且每次都不同,那么我不认为任何一个平台能够提供比其他任何平台都重要的优势,因为它们都不能利用任何预先计算的指标

删除标记后,速度的唯一其他因素来自可用的处理能力-对于SQL Azure选项,您已经知道这一点,对于其他选项,这主要取决于您决定应用何种处理-取回所有数据并进行处理取决于您自己

您可以考虑的一个选项是,您是否可以在实例(例如使用Azure Bulb或云驱动器)上自己承载该数据,然后可以在自定义的工人角色中处理数据。对于一般的数据存储,我不会考虑这一点,但如果只是这一个表和这一个查询,那么手工制作一个快速解决方案会很容易吗



更新-刚刚看到@Cade too-+1关于并行化建议的答案。

您使用动态系数(权重)的查询类型需要在每个查询上扫描整个表。SQL数据库引擎在这方面帮不了你,因为查询优化器实际上无能为力

换句话说,您需要的不是SQL数据库,而是一个“NoSQL”数据库,它可以以尽可能快的速度优化表/行访问。所以你真的不应该尝试SQLAzure和MySQL来找出这部分答案

此外,您的查询类型中的每一行都是完全独立的,因此它适合于简单的并行性。您选择的平台应符合以下条件:

  • 以最快速度扫描表格/行
  • 能够高度并行化您的操作
  • 您提到的每个平台都能够存储大量blob或类似表格的数据,以便进行非常快速的扫描检索(例如Azure中的表格存储)。每一个都使您能够“加速”多个实例以并行处理它们。这实际上取决于您最熟悉的编程环境(例如,Google/Amazon中的Java、.NET中的Azure)。本质上,他们都做同样的事情

    我的个人推荐是Azure,因为你可以