简体   繁体   English

通过多个内部联接加速SQL查询

[英]Speed up SQL Query with a multiple inner joins

I have the following query : 我有以下查询:

SELECT COUNT(DISTINCT(`person_id`)) as `count`, `mc_office`.`name` as `office_name`
FROM `aft_people` 
                      INNER JOIN `aft_offices` 
                      ON `aft_people`.`lc`=`aft_offices`.`id`
                      INNER JOIN `aft_offices` as `mc_office`
                      ON `aft_offices`.`parent_id` = `mc_office`.`id`
                      INNER JOIN `aft_constant_maps` as `constant_maps`
                      ON `aft_people`.`person_id` = `constant_maps`.`representable_id`
                      WHERE `constant_maps`.`constant_id` IN (741)
                      GROUP BY `mc_office`.`name`

Table aft_people has 1M records and aft_constant_maps has around 5M records. 表aft_people有1M条记录,而aft_constant_maps有大约500万条记录。 There are indexes on the fields 字段上有索引

  • aft_people.person_id aft_people.person_id
  • aft_constant_maps.representable_id aft_constant_maps.representable_id
  • aft_constant_maps.constant_id aft_constant_maps.constant_id

The query is really really slow and sometimes it doesn't even load at all. 该查询确实非常缓慢,有时甚至根本无法加载。 I need this query to execute in less than 10 seconds. 我需要此查询在不到10秒的时间内执行。

Do let me know if you would like more information to help me out. 如果您需要更多信息来帮助我,请告诉我。

For this query (I've just rearranged the join's so I can follow them better): 对于此查询(我刚刚重新排列了联接的位置,以便可以更好地关注它们):

SELECT COUNT(DISTINCT(`person_id`)) as `count`,
       `mc_office`.`name` as `office_name`
from `aft_people` INNER JOIN 
     `aft_constant_maps` as `constant_maps`
     ON `aft_people`.`person_id` = `constant_maps`.`representable_id` INNER JOIN
     `aft_offices` 
     ON `aft_people`.`lc` = `aft_offices`.`id` INNER JOIN
     `aft_offices` as `mc_office`
     ON `aft_offices`.`parent_id` = `mc_office`.`id` 
WHERE `constant_maps`.`constant_id` IN (741)
GROUP BY `mc_office`.`name`

The best indexes are: constant_maps(constant_id, representable_id) , aft_people(person_id, lc) , and aft_offices(id, parent_id) . 最好的索引是: constant_maps(constant_id, representable_id) aft_people(person_id, lc) constant_maps(constant_id, representable_id)aft_people(person_id, lc)aft_offices(id, parent_id) These might help speed up the query. 这些可能有助于加快查询速度。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM