1

我正在开发一个用户提供参数的 Web 应用程序,这些参数用于从多达 2000 万行的数据库中生成前 1000 项的列表。我需要一次所有前 1000 项,并且从用户的角度来看,我需要或多或少立即发生此排名。

目前,我正在使用带有用户定义函数的 MySQL 对数据进行评分和排名,然后 PHP 从那里获取它。在 1M 行的数据库上进行测试,这大约需要 8 秒,但我需要大约 2 秒的性能,即使对于高达 20M 行的数据库也是如此。最好,这个数字应该更低,这样可以保证多达 50 个同时用户的良好吞吐量。

我对任何可以尽可能高效地处理这些数据的软件的任何进程持开放态度,无论它是否是 MySQL。以下是该过程的特征和约束:

  • 与评分过程相关的每一行的数据约为每项 50 个字节。
  • 对数据库的插入和更新可以忽略不计。
  • 每个分数都独立于其他分数,因此可以并行计算分数。
  • 由于参数和参数值较多,无法预先计算分数。
  • 该方法应该适用于多个同时用户
  • 就服务器数量而言,这需要的计算资源越少越好。

谢谢

4

4 回答 4

1

一种可行的方法似乎是将所有数据加载(然后更新)到大约 1GB 的 RAM 中,并在 MySQL 之外以 C++ 之类的语言执行评分和排名。那应该比 MySQL 快。

这种方法的评分必须相对简单,因为您的要求只为每行留下十分之一微秒的时间用于评分和排名,而无需并行化或优化。

于 2011-07-07T17:21:52.423 回答
0

如果您可以发布您遇到问题的查询可以提供帮助。

虽然这里有一些东西。确保您在数据库上创建了索引。确保使用优化查询并使用连接而不是内部查询。

于 2011-07-07T17:25:32.137 回答
0

根据您的标准,提高性能的可能性取决于您是否可以使用输入标准来预过滤需要计算分数的行数。即,如果用户提供的参数之一自动取消大部分行的资格,则首先应用该过滤将提高性能。如果没有一个参数具有该特性,那么您可能需要更多的硬件或具有更高性能的数据库。

于 2011-07-07T20:20:33.420 回答
-1

对于这类问题,如果你已经完成了所有明显的软件优化(我们不知道,因为你没有提到你的软件方法),你应该尝试一些严肃的硬件优化. 最大限度地利用 SQL 服务器上的内存,并尽可能将表放入内存中。为您的表/索引存储使用 SSD,以实现快速反序列化。如果您是集群的,请将网络加速到可行的最高网络速度。

于 2011-07-07T17:26:00.133 回答