MySQL优化或IN SELECT

时间:2017-04-17 10:02:00

标签: mysql subquery

我很难优化像这样的查询,

SELECT *
FROM transactions AS t
  INNER JOIN users AS u
    ON u = t.user_id
WHERE (
  u.id = 123
  OR u.id IN (
    SELECT user_id FROM users_parents AS up
    WHERE up.parent_id = 123
  )
)

我把它归结为必要的并且更改了字段名称的简单性,因为字段不是英文的,所以如果有任何语法错误,那很可能就是因为它。

查询需要返回来自某个(父)用户或与父用户关联的任何用户的所有事务

但是,由于使用了IN SELECT,性能非常糟糕,我花了6秒多的时间在数据库的一小部分上运行这个查询,整个查询数据库需要超过600秒!

我已经读过我应该使用JOIN但我的所有尝试都在查询上给出了不同的最终结果,我认为我在语法方面做错了,我找不到自己的逻辑/语法缺陷我花了太多时间看着它并一遍又一遍地重做/重做相同的代码。

数据库结构相当简单,

= transactions 
id|user_id|....
= users
id|....
= users_parents
id|parent_id|user_id

非常感谢任何输入!

1 个答案:

答案 0 :(得分:0)

SELECT transactions.*, users.*
FROM transactions AS t
JOIN users AS u ON u.id = t.user_id
LEFT JOIN users_parents up on up.user_id = u.id
WHERE u.id = 123 or up.parent_id = 123

PS。我想用户父对象是n到1.(1个用户只有1个父对象,不同的用户可以有同一个父对象。)