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

Posted

技术标签:

【中文标题】我可以利用多线程 PHP 进行慢速 sql 查询吗【英文标题】:Can I leverage Multi-Threaded PHP for slow sql queries 【发布时间】:2021-06-13 18:04:44 【问题描述】:

我的任务是链接两个不同 API 的 id,链接将基于名称完成,因此使用通配符的搜索有点慢。

例如 - 一个 api 使用名称 Lionel Messi,而另一个使用 Lionel Andrés Messi。要解决此查询,请执行以下操作

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

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

既然查询比较慢,那我的php程序有没有可能是多线程的,这样多个查询可以同时运行。

将 100k 搜索列表拆分为 25k 的 4 个列表,然后在 4 个不同的网页中运行脚本是不是很简单?

EDIT-BTW 列“name”是表“players”中的索引 但是这似乎对速度几乎没有影响

【问题讨论】:

由于您的值以% 开头,因此不会使用索引 - ***.com/questions/5905125/… 你考虑过全文索引吗?我认为这会有所帮助。 缓存查询怎么样? 感谢您的帮助@NigelRen 【参考方案1】:

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

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

编辑如评论(mysql Improve Search Performance with wildcards (%%))中链接的答案中所述,只要字符串不以通配符——大概是因为可以根据字符串的开头立即消除行。

【讨论】:

通过这些改进,我的脚本执行时间从 9 小时缩短到了 2 分钟。虽然多线程很棒,但从字符串的开头删除通配符是差异的制造者。非常感谢 有趣!我想只要字符串不以通配符开头,就可以使用索引。

以上是关于我可以利用多线程 PHP 进行慢速 sql 查询吗的主要内容,如果未能解决你的问题,请参考以下文章

IIS 慢速多线程

多表的慢速 SQL 查询

我可以使用 Hadoop 加速慢速 SQL 存储过程吗?

我应该为这个慢速多连接查询添加哪些索引?

用简单的程序实现慢速多线程

有啥建议可以加快慢速地理查询吗?