2012-07-10 114 views
0

如何优化以下查询?优化此SQL查询

  • '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

这功课呢? – Taryn 2012-07-10 13:02:38

+0

不是。查询可以工作,但我只是想知道是否有一些方法来优化它。 – anttir 2012-07-10 13:04:04

+0

如果速度很慢,那么你应该考虑添加一些索引。 – 2012-07-10 13:06:15

回答

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),NOT NULL都

备注都

  • 指数:

    请注意,您的industry_id = "2"对我来说似乎很奇怪,ids通常是数字,如果他们不是t它看起来应该被看作整数比字符串更快处理。另外,这种双引号的方式在mysql中并不常见。你确定你的语法吗?