0

您将如何优化以下查询?

  • “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 
4

1 回答 1

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 上的索引,不为空 [分析向此表添加另一个索引(b.id、b.name、b.phone)的机会]
  • (c.company_id, c.role_id) 上的索引不为空
  • (i.company_id, i.industry_id) 上的索引,两者都不为空

评论:

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

于 2012-07-10T13:18:16.120 回答