给定排序顺序的mysql查询优化和作为参数传递的id

时间:2012-07-09 07:15:08

标签: mysql

我正在尝试优化此查询:

SELECT ob.id, obs.relation
FROM object_relation obs , object_table ob
WHERE obs.parent_id = 'ID_being_passed_as_parameter'
AND ob.id = obs.child_id        
AND ob.deleted_object_flag=0    
AND ob.id_prefix in ('prefix_variAble_passed')
ORDER BY  (SELECT m.value FROM metadata_table 
m WHERE ob.version_id=m.version_id AND m.name='SORTING_CONDITION' ) 

有可能优化吗? 任何建议都会有很大的帮助

1 个答案:

答案 0 :(得分:1)

您的查询很糟糕,因为它正在order by中为每个行执行子查询。

大多数子查询都可以转换为连接。这也是你应该做的,以及在主查询中使用连接:

SELECT ob.id, obs.relation
FROM object_relation obs 
join object_table ob 
    on ob.id = obs.child_id 
    AND ob.deleted_object_flag=0 
    AND ob.id_prefix in ('prefix_variable_passed')
left join metadata_table m 
    on ob.version_id = m.version_id
    AND m.name = 'SORTING_CONDITION'
WHERE obs.parent_id = 'ID_being_passed_as_parameter'
ORDER BY m.value;

left join的使用允许metadata_table中没有匹配的行,但仍会显示在结果中。

请注意,还将谓词移动到联接的on子句中,可以将作为行加入而不是在结尾处应用,这比临时更有效结果集尽可能小。