2011-09-07 45 views
1

作爲繼承系統的一個非常緩慢的重構過程的一部分,我需要消除一些慢連接和子查詢。當我熟悉這個系統的時候,我正在慢慢地清理數據庫結構,擺脫磁帶上的感覺,進行漸進式改進,希望在此期間沒有任何突破。其中一部分涉及將來自兩個由三分之一鏈接的表格的數據合併爲一個。通過鏈接表將某個表的列中的某些數據複製到另一個列中

表結構與此類似:

CREATE TABLE groups 
(
    group_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -- various other fields that are appropriate to groups 
    ... 
    -- these fields need to be filled 
    a ENUM(...) NOT NULL, 
    b INTEGER NOT NULL, 
    c VARCHAR(...) NOT NULL 
); 

CREATE TABLE items 
(
    -- key is determined by an external data source 
    item_id INTEGER NOT NULL PRIMARY KEY, 
    -- various other fields that are appropriate to items 
    ... 
    -- these fields shouldn't be here, but in the groups table 
    a ENUM(...) NOT NULL, 
    b INTEGER NOT NULL, 
    c VARCHAR(...) NOT NULL 
); 

CREATE TABLE group_items 
(
    item_id INTEGER NOT NULL, 
    group_id INTEGER NOT NULL, 
    PRIMARY KEY (item_id,group_id) 
); 

項目可以是在一個以上的基團。表「items」中的每個記錄都有列a,b和c的值,這些值實際上不是項目的屬性,而是項目所屬的組的屬性。 (這會導致問題,因爲如果項目位於另一個組中,則值可能會有所不同)。

我無法從項目表中刪除字段,因爲它們是由幾乎瘋狂的數據源中的瘋狂導入過程填充的。在我修復導入過程之前,我一直堅持讓項目表中存在字段,但在短期內,至少我可以消除緩慢查找來獲取它們。

現在我在PHP中有一個遍歷每個組的循環,從它遇到的第一個項目中獲取值(這很好 - 組中的所有項目將具有a,b和c的相同值)並將它們放入組中。這個過程非常緩慢且費力,而且不幸的是在超負荷和動力不足的服務器上運行頻繁。有沒有一種巧妙的方法可以將項目表中的這些(只有這些)值複製到組表中,並讓MySQL完成繁重的工作,而不是依賴PHP腳本?

回答

0

看起來像我找到了我自己的答案。由於每個組中的項目數量相對較少,有可能是正在做一些重複的工作,但它不是一個瓶頸,比PHP循環快得多:

UPDATE 
    groups g 
    INNER JOIN group_items USING(group_id) 
    INNER JOIN items i USING(item_id) 
SET 
    g.a = i.a, 
    g.b = i.b, 
    g.c = i.c; 

似乎做什麼,我需要。

相關問題