2012-07-10 130 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中並不常見。你確定你的語法嗎?