php - 使用 MySQL 和 PHP 高效处理大量数据

标签 php mysql

我需要找到一种在 PHP/MySQL 中高效处理大量数据的方法。情况是这样的:

我有一个包含一百万条记录的数据库表。根据来自 PHP 的用户输入,我需要根据一个重要的计算步骤对所有这 100 万条记录进行排名,以便我可以选择得分最高的项目。我的问题是,如果我将数据重新排列到列中并使用 array_multisort,从内存使用的角度来看,这种扩展非常差,特别是在排序步骤。

我能想到的替代方法是:

  • 在 PHP 中进行计算并将带有分数的数据重新插入到临时表中,使用 SELECT ... ORDER BY score ... LIMIT 查询检索得分最高的项目
  • 在 PHP 中进行计算并将数据和分数输出到 CSV 文件中,然后调用命令行排序实用程序,然后读取前 X 行
  • 使用存储过程在 MySQL 中进行计算并检索前 X 个项目,如选项 1 中所示。我担心的是数据库是否非常适合这将涉及的数字运算

对于搜索引擎之类的东西来说,这一定是一个相当普遍的问题。可扩展性是第一要务,但性能也必须非常好。这些方法中的一种是最好的,还是有其他一些我什至没有考虑过的好选择?

最佳答案

假设您的数据集太大而无法存储在内存中……如果您只需要前 n 个项目,则在分页浏览 100 万行时,您可以只将最前面的结果保留在内存中。这也适用于您的临时表想法,写入每个批处理的顶部记录。

另一种选择是编写用户定义的函数:

http://dev.mysql.com/doc/refman/5.1/en/adding-functions.html

关于php - 使用 MySQL 和 PHP 高效处理大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419753/

相关文章:

php - 如何使用 foreach 语句中 value = 1 的数据库列中的逗号将数组中的数据内爆?

mysql - 如何获得表中所有内容的总和?

python - 如何使用python从数据库中提取值

php - 如果表中不存在 userID,则添加 mysql 行

mysql - 将表主键 ID 更改为按创建日期顺序排列

jquery - 当 ajax 请求被中止时,我如何关闭 mysql 连接?

php - htaccess 将根目录中的所有文件重定向到子目录中的相应页面

php - 统计收到的新消息?

php - 电子邮件激活链接无法按预期工作

php - 使用不兼容的函数实现接口(interface)和错误