我可以利用多线程PHP进行慢速sql查询吗



我的任务是链接两个不同API的id,链接将根据名称进行,因此使用通配符的搜索有点慢。

例如,一个api使用了莱昂内尔·梅西的名字,而另一个api则使用莱昂内尔·安德雷斯·梅西的名字。要解决此问题,请执行

select id from players WHERE name LIKE '%Lionel%Messi%'

这被证明是有效的,但速度很慢,查询平均需要0.3秒,需要10万次搜索,这将需要一整天的时间。

由于较慢的部分是查询,所以我的php程序是否可以是多线程的,以便同时运行多个查询。

它会像将10万个搜索列表拆分为4个25万个列表一样简单吗?只需在4个不同的网页中运行脚本即可?

EDIT-BTW列";name";是表"中的索引;玩家";然而,这似乎对的速度几乎没有影响

是的,听起来这可以多线程完成,因为每个操作(链接一对ID(都不依赖于以前操作的结果。为了获得最佳性能,您可以将输入(表(拆分为与处理器内核一样多的列表。根据您的要求,可以通过多种方式进行拆分,例如ID范围、拆分为几个不同的表等。是的,在多个浏览器窗口中运行脚本应该创建所需的并行化,利用所有可用的CPU核心。这可能取决于你的服务器(Apache、nginx等(是如何配置的,但我认为大多数默认配置的服务器都会做到这一点。

为了详细说明为什么索引没有任何效果——索引只是一种数据结构,它允许你反转选择行的基本功能,以便找到列与特定值匹配的行。因此,输入不是行号(不是id,而是物理存储中定位该行的数据的实际偏移量(,输出是行,而是列值(例如数字id或字符串(,而输出是与该值匹配的行号列表。使用了各种数据结构,但机制取决于数据结构中存储在磁盘上的实际值(例如ID(。因此,通配符不被索引的原因是,与每个唯一值匹配的每个可能的通配符都必须存储在磁盘上。

编辑如评论中链接的答案所述(Mysql使用通配符提高搜索性能(%%((,只要字符串不以通配符开头,Mysql就可以使用带通配符的索引——大概是因为可以根据字符串的开头立即消除行。

最新更新