如何优化使用IN的MySQL

时间:2014-03-14 11:49:55

标签: mysql query-optimization

我有3张桌子:

程序(关于不同内部程序的某种信息)

procedure_department(链接表,每个程序对哪个部门有效)

权限(每个用户可以添加/编辑/删除他获得权限的程序)

我愿意选择当前用户可以访问或添加自己的所有程序。

$sql = "SELECT p.id, p.name, p.type, p.status
        FROM procedures AS p
            LEFT JOIN procedure_department AS pd ON p.id = pd.procedureID
        WHERE p.addedBy = 47 OR pd.departmentID IN (SELECT `option` FROM permissions WHERE user = 47 AND module = 'info' AND permission = 'add') ";

然而,执行需要数年时间,我希望从结构或查询的角度看待任何优化建议。

1 个答案:

答案 0 :(得分:1)

尽管在最近的版本中已经修复了这个问题,但某些版本的MySQL在使用子查询优化in方面做得不好。您可以将其替换为exists

SELECT p.id, p.name, p.type, p.status
FROM procedures p LEFT JOIN
     procedure_department pd
     ON p.id = pd.procedureID
WHERE p.addedBy = 47 OR
      exists (SELECT 1
              FROM permissions
              WHERE user = 47 AND module = 'info' AND permission = 'add' and
                    option = pd.departmentID
             );

为获得最佳效果,请在permissions(option, user, module, permission)上添加索引。