优化此SQL查询

时间:2012-07-10 13:01:18

标签: mysql sql performance optimization

您将如何优化以下查询?

  • 'example_companies'包含公司数据。
  • 'example_roles_companies'包含公司角色(支点)
  • 'example_industries_companies'包含公司行业(支点)

SELECT DISTINCT a.id,
                a.mode,
                a.name,
                a.city,
                b.name AS USER,
                b.phone
FROM   example_companies a
       LEFT JOIN example_users b
         ON a.contact_id = b.id
       LEFT JOIN example_roles_companies c
         ON a.id = c.company_id
WHERE  "2" IN (SELECT industry_id
               FROM   example_industries_companies
               WHERE  company_id = a.id)
       AND c.role_id = 2
       AND a.account_mode != 2
ORDER  BY a.id 

1 个答案:

答案 0 :(得分:4)

查询:

SELECT DISTINCT a.id,
                a.mode,
                a.name,
                a.city,
                b.name AS USER,
                b.phone
FROM example_companies a
LEFT JOIN example_users b ON a.contact_id = b.id
INNER JOIN example_roles_companies c ON a.id = c.company_id AND c.role_id = 2
INNER JOIN example_industries_companies i
        ON i.company_id = a.id AND i.industry_id = "2"
WHERE 
    a.account_mode != 2
ORDER BY 
    a.id

结构:

  • a.id上的索引,而不是
  • b.id上的索引,而不是null [分析另一个索引(b.id,b.name,b.phone)添加到此表的机会]
  • 索引(c.company_id,c.role_id)不为空
  • 索引(i.company_id,i.industry_id),非空

说明:

请注意,你的industry_id = "2"对我来说似乎很奇怪,ID通常是数字,如果不是,则应该查看它,因为整数的处理速度比字符串快。另外,这种双引号方式在mysql中并不常见。你确定你的语法吗?

相关问题