我已经只读访问MySQL数据库,我需要循环访问以下查询大约9000次,每次使用不同的$ content_path_id。我在一个PERL脚本中调用它,它从文件中提取'$ content_path_id。
SELECT an.uuid FROM alf_node an WHERE an.id IN
(SELECT anp.node_id FROM alf_node_properties anp WHERE anp.long_value IN
(SELECT acd.id FROM alf_content_data acd WHERE acd.content_url_id = $content_path_id));
以这种方式编写,它将永远进行每次查询(每次约1分钟)。如果我不需要,我真的不会等待9000多分钟才能完成。有没有办法加快这个查询?也许通过加入?我目前的SQL技能令人尴尬生锈...
答案 0 :(得分:1)
这是使用连接的等效查询。它取决于在表上定义的索引将如何执行。
如果您的Perl接口具有预准备语句的概念,您可以通过准备一次并执行9000种不同的绑定来节省一些时间。
您还可以通过使用大acd.content_url_id In ($content_path_id1, $content_path_id2, ...)
子句构建一个查询来节省时间
Select
an.uuid
From
alf_node an
Inner Join
alf_node_properties anp
On an.id = anp.node_id
Inner Join
alf_content_data acd
On anp.long_value = acd.id
Where
acd.content_url_id = $content_path_id
答案 1 :(得分:0)
尝试使用劳伦斯解决方案的这个扩展,用一个额外的JOIN替换长的OR列表:
Select
an.uuid
From alf_node an
Join alf_node_properties anp
On an.id = anp.node_id
Join alf_content_data acd
On anp.long_value = acd.id
Join (
select "id1" as content_path_id union all
select "id2" as content_path_id union all
/* you get the idea */
select "idN" as content_path_id
) criteria
On acd.content_url_id = criteria.content_path_id
我上面使用过SQL Server语法,但您应该可以轻松翻译它。