zoukankan      html  css  js  c++  java
  • SQL优化之多表关联批量更新

    1、背景

    清洗表cookie_clean_t的数据分配清洗,清洗成功的结果记录在成功表cookie_short_succ_t中,间隔10分钟根据成功表cookie_short_succ_t的数据更新清洗表cookie_clean_t中数据状态为成功。清洗表数据量50多万条!

    2、实现方案

    2.1、版本V1

    UPDATE cookie_clean_t cct SET cct.state=1 WHERE cct.state=0
    AND cct.uuid IN(SELECT csst.uuid FROM cookie_short_succ_t csst WHERE csst.ctime<![CDATA[ <= ]]>#{lastTime})
    AND cct.ctime<![CDATA[ >= ]]>CURDATE()

    在配置高的生产环境(8核16G内存4M带宽)并未发现验证问题,在测试环境(2核4G内存2M带宽)影响到数据分发的SQL查询语句吃CPU占到195%

    2.2、版本V2

    UPDATE cookie_clean_t cct
    INNER JOIN cookie_short_succ_t csst ON cct.uuid=csst.uuid 
    SET cct.state=1
    WHERE cct.state=0 AND cct.ctime>=CURDATE() AND csst.ctime<![CDATA[ <= ]]>#{lastTime}

    优化成表关联批量更新后索引生效,CPU占用不足2%

    分析SQL语句例子:

    EXPLAIN
    UPDATE cookie_clean_t cct SET cct.state=1 WHERE cct.state=0
    AND cct.uuid IN(SELECT csst.uuid FROM cookie_short_succ_t csst WHERE csst.ctime<='2019-09-10 09:00:00')
    AND cct.ctime>=CURDATE()

    1 UPDATE cct index idx_state,idx_ctime PRIMARY 8 502077 100 Using where
    2 DEPENDENT SUBQUERY csst ALL 1378 3.33 Using where

    EXPLAIN
    UPDATE cookie_clean_t cct
    INNER JOIN cookie_short_succ_t csst ON cct.uuid=csst.uuid
    SET cct.state=1
    WHERE cct.state=0 AND cct.ctime>=CURDATE() AND csst.ctime<='2019-09-10 09:00:00';

    1 SIMPLE csst ALL 284 33.33 Using where
    1 UPDATE cct eq_ref PRIMARY,idx_state,idx_ctime,idx_uuid PRIMARY 8 db_wb3.csst.uuid 1 25 Using where

    show full processlist;
    kill id;

  • 相关阅读:
    win服务大全 (转)
    给大家贴一点好东东 喜欢电影的朋友请看
    滚动字幕的制作 marquee
    嵌入式软件工程师读书计划总纲 转
    优秀男人的十五条标准[转]
    寒冷的冬天到了,我们开始画饼充饥
    如何用.NET创建Windows服务 [转]
    请教:如何进行存储过程的调试
    人际交往(转)
    用户控件 与 Response.Redirect 转向的问题
  • 原文地址:https://www.cnblogs.com/xx0829/p/11496558.html
Copyright © 2011-2022 走看看