0

我的查询中有多个连接集。我有多个连接,因为表的结构可以得到我想要的。我的主要加入,我分为三组,如下所述。如果我只有一套,查询时间是相当快的。当我有两套活动时,查询时间约为 2 分钟。如果如下图所有三组都处于活动状态,则需要的时间太长。

任何有关优化此查询的帮助将不胜感激。

$query  = "SELECT   `Databases`.*, 
                    `DatabaseDescriptors`.*, 
                    `DatabaseContents`.*, 
                    `DatabaseAccessLevels`.*, 
                    `Providers`.*, 
                    GROUP_CONCAT(`Descriptors`.DescriptorName SEPARATOR ', ') as DescriptorNames, 
                    GROUP_CONCAT(`Contents`.ContentName SEPARATOR ', ') as ContentNames, 
                    GROUP_CONCAT(`AccessLevels`.AccessLevelName SEPARATOR ', ') as AccessLevelNames ";

$query .= "FROM `Databases` ";

// SET 1

$query .= "JOIN `DatabaseDescriptors` 
                ON `DatabaseDescriptors`.DatabaseID = `Databases`.DatabaseID ";

$query .= "JOIN `Descriptors` 
                ON `Descriptors`.DescriptorID = `DatabaseDescriptors`.DescriptorID ";

//SET 2

$query .= "JOIN `DatabaseContents`
                ON `DatabaseContents`.DatabaseID = `Databases`.DatabaseID ";

$query .= "JOIN `Contents`
                ON `Contents`.ContentID = `DatabaseContents`.ContentID ";

//SET 3

$query .= "JOIN `DatabaseAccessLevels`
                ON `DatabaseAccessLevels`.DatabaseID = `Databases`.DatabaseID ";

$query .= "JOIN `AccessLevels`
                ON `AccessLevels`.AccessLevelID = `DatabaseAccessLevels`.AccessLevelID ";

$query .= "JOIN `Providers`
                ON `Providers`.ProviderID = `Databases`.ProviderID ";

$query .= "AND `Databases`.DatabaseID = 47";
4

1 回答 1

0

性能问题的原因是“数据库”具有多个描述符、访问级别和内容。假设一个数据库每个有 10 个。查询最终将其转换为 10*10*10 = 1000 行进行处理。

解决方案是在进行联接之前进行聚合。例如,而不是这个: $query .= "JOIN DatabaseDescriptors ON DatabaseDescriptors.DatabaseID = Databases.DatabaseID ";

$query .= "JOIN `Descriptors` 
                ON `Descriptors`.DescriptorID = `DatabaseDescriptors`.DescriptorID ";

你将会拥有:

(select dd.DatabaseId,
         GROUP_CONCAT(d.DescriptorName SEPARATOR ', ') as DescriptorNames
 from DatabaseDescriptors dd join
      Descriptions d
      on dd.DescriptorID = d.DescriptorID
 group by dd.DatabaseId
) dd
on Databases.DatabaseId = dd.DatabaseId

(您可以替换group by dd.DatabaseIdwithwhere dd.DatabaseId = 47来处理您的一个案例。我的猜测是您可能需要所有数据库的此信息。如果是这样,group by DatabaseId请在外部查询中添加一个。)

然后,您需要对所有三group_concat()列重复此操作。

注意:您正在从所有表中提取所有字段。但是,只有一行返回,因为您有一个没有 的聚合查询group by。我猜您在group_concat()-created 列表中也会出现重复项。这种方法也将解决这个问题。

于 2013-07-22T00:50:35.230 回答