<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • mysql批量更新數據(mysql批量更新千萬數據思路)


    我們在數據庫執行update語句的時候,到底是鎖表還是鎖行?這里直接用MySQL上例子測試下。

    一、環境準備

    1、新建一個表

    create table test_update(
       id BIGINT  not null primary key COMMENT '主鍵ID,雪花算法生成',
       name VARCHAR(100) COMMENT '姓名',
       user_no VARCHAR(20) COMMENT '用戶編號'
    );

    2、插入兩條數據

    insert into test_update(id,name,user_no)values(1,'張三','001');
    insert into test_update(id,name,user_no)values(2,'李四','002');

    二、開始測試

    場景一:不加索引

    開啟事務
    sql1:update test_update set name=’張三1’ where user_no in(‘001’);
    不提交事務


    開啟事務
    sql2:update test_update set name=’李四1’ where user_no in(‘002’);
    提交事務

    我們發現在sql1不提交事務的情況下,sql2被阻塞了,只有當sql1的事務提交后sql2才會執行成功。

    總結:在不加索引的情況下,update語句鎖表。

    場景二:加索引

    先在user_no加索引
    ALTER TABLE test_update ADD INDEX index_name (user_no);


    開啟事務
    sql1:update test_update set name=’張三1’ where user_no in(‘001’);
    不提交事務


    開啟事務
    sql2:update test_update set name=’李四1’ where user_no in(‘002’);
    提交事務

    我們發現在sql1不提交事務的情況下,sql2也執行成功了,也就是sql2不依賴于sql1的事務提交。

    總結:在加索引的情況下,update語句鎖行。

    場景三:加索引,但是in里面是復雜查詢

    上面的例子in里面都是確定的值,加入in里面是查詢出來的呢,如下例子(user_no已經加上索引)

    開啟事務
    sql1:update test_update set name=’張三1’ where user_no in(select user_no from other_table where id=1);
    不提交事務


    開啟事務
    sql2:update test_update set name=’李四1’ where user_no in(select user_no from other_table where id=2);
    提交事務

    我們發現在sql1不提交事務的情況下,sql2被阻塞了,只有當sql1的事務提交后sql2才會執行成功,跟場景一結果一樣。

    總結:在加索引的情況下,in里面是不確定的值,update語句鎖表。

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费