2013-07-21 75 views
0

我在查询中发生多个连接集。我有多个连接,因为这些表的结构可以得到我想要的结果。我的主要连接,我分成三组,如下面评论。如果我只有一组,查询时间相当快。当我有两组活动时,查询时间大约2分钟。如果所有三组都如下所示激活,则需要很长时间。使用多个连接和Group_Concat优化php mySQL查询

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

$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"; 

回答

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 

(你可以用where dd.DatabaseId = 47代替group by dd.DatabaseId只处理您的一个情况,我的猜测是,你可能希望这些信息对所有数据库如果是的话,请添加。 group by DatabaseId)。

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

注意:您正在从所有表中拉出所有字段。但是,只有一行正在返回,因为您的聚合查询没有group by。我猜你在group_concat()创建的列表中也得到了重复。这种方法也将解决这个问题。

+0

谢谢戈登。我对mySQL的有限知识并没有帮助,但我理解你的意思。我会尝试这种方法。 – user2604924