使用嵌套的select语句优化MySQL查询?

时间:2013-09-01 20:41:34

标签: mysql sql

我已经只读访问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技能令人尴尬生锈...

2 个答案:

答案 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语法,但您应该可以轻松翻译它。