在PHP中处理大型MySQL查询

4
我有一个大约有1400万行的表格。每一行都包含一段文本。我还有另一个表格,大约有6000行,每一行都有一个单词和六个数字值。我需要从第一个表格中取出每一段文本,找到第二个表格中每个单词出现的次数,然后计算每段文本的六个值的平均值并存储它。
我有一台debian机器,配备i7处理器和8GB内存,应该能够处理这个问题。目前我正在使用php substr_count()函数。但是,PHP似乎不是解决这个问题的正确方法。除了解决超时和内存限制问题之外,是否有更好的方法来解决这个问题?是否可能只使用SQL?如果不是,最好的方法是什么,可以在不过载服务器的情况下执行我的PHP代码?

所以你基本上是在重写一个像solr这样的索引器? - CodeCaster
1
我相信这可以在纯SQL中完成。你能提供准确的表结构吗? - Derek Organ
3个回答

3
从“大”表中逐个处理每个记录。将这个单独的“块”文本加载到您的程序(php或其他语言)中,进行搜索和计算,然后在需要的位置保存适当的值。
将每个记录作为独立的事务进行处理,与其他记录隔离。如果被中断,使用已保存的值确定重新开始的位置。
完成现有记录后,以后只需要在输入或更新记录时执行此操作,因此更容易。您现在只需要一次性地获取数据即可。

1
这就是我最终的做法。它每次处理一千行,然后再调用自身来处理下一个一千行,并输出所花费的时间。目前每20秒处理1000行,因此需要大约三天的时间。虽然只使用了一个核心,但时间不是问题,所以我想我会让它保持不变。 - b3n

1

你到底想做什么?如果你想创建一个带有加权函数的搜索引擎,那么你可能应该放弃这个想法,而是使用MySQL全文搜索功能和索引。如果你仍然需要这个特定的解决方案,当然可以完全在SQL中实现。你可以用一条查询语句或者一个触发器来完成,在每次插入或更新行后运行。如果不经过很多麻烦,你将无法用PHP正确地完成这项任务。

为了给你一个具体的答案,我们确实需要更多关于查询、数据结构以及你想要做什么的信息。


抱歉如果我没有表达清楚。我只想运行一次查询,遍历数据库中的6000个单词匹配到的所有单词,并为每个1400万段文本生成六个平均值。因此,我将拥有1400万行数据,但是对于每一行,我会添加6列,这些列将包含在文本正文中找到的所有单词的平均值。 - b3n

0

重新设计 IT()

如果占用磁盘空间大小不重要,只需将表连接成一个即可。


将6000个表格放入内存[内存表],并每小时备份一次

INSERT IGNORE into back.table SELECT * FROM my.table;


在大表中创建“自己的”索引

将“名称索引”列添加到大表中,其中包含行的ID

-- 需要更多关于查询的信息以找到解决方案


我已经为大表添加了索引,并考虑将另一个表添加到内存中。目前,我只是在大表中查找ID,然后对于其他表中的每一行都执行substr_count()。但我想为大表中的每个ID运行查询,我认为仅执行SELECT *会导致超时或内存限制问题? - b3n
为什么你要将“pre作为列值”,进行str_count和strlen操作,并写入到数据库中? - user956584

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接