开发者

Copying certain data from one table's columns into another through a link table

As part of a very slow refactoring process of an inherited system, I need to eliminate a couple of slow joins and subqueries. As I'm familiarising myself with the system, I'm slowly sanitising the database structure, to get rid of the held-together-by-duct-tape feeling, making incremental improvements, hoping nothing breaks in the meantime. Part of this involves combining data from two tables linked by a third into one.

Table structure is similar to this:

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)
);

An item may be in more than one group. Each record in the table "items" has values for columns a, b and c, which are actually not properties of the items, but of the groups of which the items are a part. (This is causing problems, as the values may be different if the item is in another group).

I can't remove the fields from the items table yet, as they are filled by an insane import process from an almost-as-insane data source. Until I get around to fixing the import process, I'm stuck with having the fields exist in the items table, but in the short term at least I can eliminate the slow lookups to get them.

Right now I have a loop in PHP that runs over each group, takes the values from the first item it encounters (which is fin开发者_如何学运维e -- all items in a group will have the same values for a, b and c) and places them into the group. This process is rather slow and laborious and unfortunately runs very frequently on an overloaded and underpowered server. Is there a smart way to copy these (and only these) values from the items table into the groups table and have MySQL do the heavy lifting, rather than relying on a PHP script?


Looks like I found my own answer. As the number of items in each group is relatively small, there may be some duplicate work being done but it's not a bottleneck and much faster than the PHP loop:

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;

Seems to do what I need.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜