mysql版本:5.7.14
情况描述:
     指标表层次用路径(paths)表示,要得具体指标的层次,建立临时表,保存一指标每层指标的名称,然后更新指标层次表。
目前,小数据量时更新是可以的,但数据量大,就会出现问题,显示为空,但每行长度还不同,就是显示为空白。
源表数据量为85万行左右,指标共9层。现象如下:SELECT paths,Layer6,CHAR_LENGTH(layer6),LENGTH(Layer6)
FROM mii_industryeconomy
WHERE layer6 is not NULL 
LIMIT 200;更新语句为:UPDATE mii_industryeconomy a
JOIN mii_tempindictor b ON a.`Code`=b.`Code`
SET Layer6=b.LevelName
WHERE iLEVEL=6 ;
受影响的行: 76602
时间: 22.138s加一个条件后,能正常更新。
UPDATE mii_industryeconomy a
JOIN mii_tempindictor b ON a.`Code`=b.`Code`
SET Layer6=b.LevelName
WHERE iLEVEL=6 AND b.`CODE`='00020001001400010004000100010001';
此时的结果如下:

解决方案 »

  1.   

    你的更新语句,2个表的code是一一对应的吗,如果是1对多的,可能会导致问题。
      

  2.   

    同一level,code是唯一的,mii_tempindictor 的数据是从industryeconomy 派生而来,主要是解析paths路径,形成了多条记录。
    主要问题是,如果数据量小,是可以的,数据量超过3万,貌似就不行了。
      

  3.   


    但是你的update语句看上去很简单,就是关联表,然后用另一个表的数据来更新主表的数据,而且code是唯一的,查询速度也会很快。
      

  4.   

    是,语句看起来没什么问题,在数据量少的情况,能正常更新,中文可以正常显示。数据量大了,就会出问题,用char_length()得出来的结果不对,不知道是什么原因。
    数据提供方说mysql在Windows下效率不好,建议系统 改为linux,是Windows下Mysql真的不好用吗?
      

  5.   

    先把mii_industryeconomy表里iLEVEL=6 的抽到临时表 ,
    用临时表去和mii_tempindictor b 做 join
    最后再更新mii_industryeconomy