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

構造:

  • null 以外の a.id のインデックス
  • null 以外の b.id のインデックス [このテーブルに別のインデックス (b.id、b.name、b.phone) を追加する機会を分析する]
  • (c.company_id、c.role_id) のインデックスが両方とも null でない
  • (i.company_id、i.industry_id) のインデックス、両方とも null ではない

備考:

あなたは私には奇妙に思えることに注意してくださいindustry_id = "2".IDは一般的に数値であり、そうでない場合は、整数は文字列よりも処理が速いため、それを確認する必要があります. さらに、この二重引用符の方法は mysql では一般的ではありません。あなたの構文は確かですか?

于 2012-07-10T13:18:16.120 に答える