0

我拥有对 MySQL 数据库的只读访问权限,我需要循环以下查询大约 9000 次,每次使用不同的 $content_path_id。我在从文件中提取“$content_path_id”的 PERL 脚本中调用它。

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 技能令人尴尬地生疏了......

4

2 回答 2

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
于 2013-09-01T20:45:08.143 回答
0

试试这个对 Laurence 解决方案的扩展,它用一个额外的 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 语法,但您应该能够轻松地翻译它。

于 2013-09-01T21:51:04.423 回答