使用join和group by优化更新查询

时间:2013-01-30 08:55:51

标签: mysql join group-by sql-update query-optimization

我的表格总计包含字段DATASOURCE,PEOPLEID,TOTVALUE(约6百万条记录)和表格 source1 ,字段为PEOPLEID和VALUE(ab.3百万记录)。 在总计中,每个DATASOURCE都有一个唯一的人员,而在 source1 中,每个人都有几条记录。 source1 中的所有人员都已包含在总计中,但不包含在其值中。

我设法获得更新查询,更新总计的字段TOTVALUE从“测试”小表上的 source1 获取它,但现在我正在尝试让它在真正的桌子上运行它永远在运行...我将不得不重复它 source2 source3 ,依此类推......

我运行的查询是:

UPDATE  totals t
    INNER JOIN 
    (
        SELECT  peopleid,
                sum(value) AS TotValues
        FROM source1
        GROUP BY peopleid
    ) s
    ON t.peopleid = s.peopleid
SET t.totvalue = s.TotValues
where
t.datasource like 'source1'

您认为有更好的方法来运行和优化此查询吗?

2 个答案:

答案 0 :(得分:0)

  • 使用=代替LIKE,因为,我认为,你不是在搜索模式吗?
  • 在两个表格的INDEX列上创建PeopleIDtotalssource
  • 如果可能,请在表datasource
  • 上的列totals上添加索引

查询,

UPDATE  totals t
        INNER JOIN 
        (
            SELECT  peopleid,
                    sum(value) AS TotValues
            FROM    source1
            GROUP   BY peopleid
        ) s
        ON t.peopleid = s.peopleid
SET     t.peopleid = s.peopleid
WHERE   t.datasource = 'source1'

答案 1 :(得分:0)

首先尝试加入数据。 请记住在两个表中为peopleid列创建索引。

UPDATE  totals t
    INNER JOIN 
    (
        select * from (
          SELECT  t.datasource,
                  peopleid,
                  sum(value) AS TotValues
          FROM source1 s INNER JOIN 
               totals t
                      ON t.peopleid = s.peopleid
          GROUP BY t.datasource, t.peopleid
        ) s_aux
    ) s
    ON t.peopleid = s.peopleid and t.datasource = s.datasource
SET t.totvalue = s.TotValues