2013-07-21 78 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