有没有办法使这个MySQL查询更有效?

时间:2016-05-17 22:47:20

标签: mysql inner-join

select * from q_and_a qa 
where keyword = :keyword_top 
  or id in (
    select qk.question_id 
    from question_keywords qk 
    inner join q_and_a qa on qa.id = qk.question_id 
    inner join keywords k on k.id = qk.keyword_id 
    where k.keyword = :keyword_bottom 
  )

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的查询,您就不需要子查询,而是outer joins

select q.*
from q_and_a q
    left join question_keywords qk on q.id = kq.question_id 
    left join keywords k on k.id = gk.keyword_id
where q.keyword = :keyword_top or 
    k.keyword = :keyword_bottom

您可能需要使用distinct,具体取决于样本数据和所需结果。

实际上,因为这确实是一个关于性能的问题,这可能会或可能不会使它更快。像往常一样,它只是取决于。

现有查询的其他几个变体包括使用exists或使用union all代替or。您必须运行比较以查看在您的情况下最有效的方法。您的索引和键也需要适当定义。

答案 1 :(得分:0)

对于sql引擎来说,作为左连接执行此操作可能更干净,而不是执行子查询。

SELECT qa.* 
FROM   q_and_a qa 
       LEFT JOIN question_keywords qk 
              ON qa.id = qk.question_id 
       LEFT JOIN keywords k 
              ON k.id = qk.keyword_id 
WHERE  qa.keyword = :keyword_top 
        OR k.keyword = :keyword_bottom