精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一個 MySQL 插入死鎖問題

數據庫 MySQL
本文就以一個簡單的功能示例為大家演示一下insert into ...... select 可能引發的問題和解決方案。

在進行MySQL數據備份遷移時,很多人為了避免網絡IO的開銷而選用insert into ...... select 進行數據遷移備份,但你是否知道這種做法會存在那些隱患呢? 所以本文就以一個簡單的功能示例為大家演示一下insert into ...... select 可能引發的問題和解決方案。

問題復現

這里為了演示問題,筆者生成了一張帶有500w數據的數據表,對應DDL語句如下:

CREATE TABLE `batch_insert_test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `fileid_1` varchar(100) DEFAULT NULL,
  `fileid_2` varchar(100) DEFAULT NULL,
  `fileid_3` varchar(100) DEFAULT NULL,
  `fileid_4` varchar(100) DEFAULT NULL,
  `fileid_5` varchar(100) DEFAULT NULL,
  `fileid_6` varchar(100) DEFAULT NULL,
  `fileid_7` varchar(100) DEFAULT NULL,
  `fileid_8` varchar(100) DEFAULT NULL,
  `fileid_9` varchar(100) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2520001 DEFAULT CHARSET=utf8mb3 COMMENT='測試批量插入,一行數據1k左右';

使用count語句查看數據量:

select count(*)  from batch_insert_test;

稍微久等了一小會,輸出語句如下,可以看到一張表數據剛剛好達到500w:

count(*)|
--------+
 5000000|

同樣的我們給出備份遷移表的DDL,表結構是一樣的,唯一區別就是表名后綴多了個bak:

CREATE TABLE `batch_insert_test_bak` (
  `id` int NOT NULL AUTO_INCREMENT,
  `fileid_1` varchar(100) DEFAULT NULL,
  `fileid_2` varchar(100) DEFAULT NULL,
  `fileid_3` varchar(100) DEFAULT NULL,
  `fileid_4` varchar(100) DEFAULT NULL,
  `fileid_5` varchar(100) DEFAULT NULL,
  `fileid_6` varchar(100) DEFAULT NULL,
  `fileid_7` varchar(100) DEFAULT NULL,
  `fileid_8` varchar(100) DEFAULT NULL,
  `fileid_9` varchar(100) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2520001 DEFAULT CHARSET=utf8mb3 COMMENT='測試批量插入,一行數據1k左右';

此時我們使用數據庫連接工具在會話窗口,執行如下遷移語句:

insert into batch_insert_test_bak   select * from batch_insert_test;

然后我們再寫一段程序模擬插入:

 @Test
    public void insert() {
        while (true) {
            BatchInsertTest batchInsertTest = new BatchInsertTest();
            batchInsertTest.setFileid1(RandomUtil.randomString(1));
            batchInsertTest.setFileid2(RandomUtil.randomString(1));
            batchInsertTest.setFileid3(RandomUtil.randomString(1));
            batchInsertTest.setFileid4(RandomUtil.randomString(1));
            batchInsertTest.setFileid5(RandomUtil.randomString(1));
            batchInsertTest.setFileid6(RandomUtil.randomString(1));
            batchInsertTest.setFileid7(RandomUtil.randomString(1));
            batchInsertTest.setFileid8(RandomUtil.randomString(1));
            batchInsertTest.setFileid9(RandomUtil.randomString(1));
            batchInsertTest.setCreateDate(new Date());

            long begin = System.currentTimeMillis();
            batchInsertTestMapper.insert(batchInsertTest);
            long end = System.currentTimeMillis();

            log.info("插入耗時:{} ms", end - begin);

            ThreadUtil.sleep(10000L);
        }
    }

從輸出結果來看,一開始插入并不是很耗時,基本都是毫秒級完成,但是隨著時間的推移,插入的耗時逐漸增加,最慢的一次數據插入竟然花費了1分多鐘:

18.546 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:148 ms
28.778 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:221 ms
38.926 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:143 ms
49.588 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:652 ms
59.763 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:166 ms
09.820 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:56 ms
19.930 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:99 ms
30.027 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:86 ms
40.145 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:113 ms
50.238 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:79 ms
17.178 INFO  c.s.w.WebTemplateApplicationTests:117  main                    插入耗時:76927 ms

原因剖析

我們不妨使用如下語句查看一下執行計劃:

explain insert into batch_insert_test_bak   select * from batch_insert_test;

可以看出無論是insert還是select都是走全表掃描,因為select查詢沒有走索引導致select子句的執行過程會針對整張表從上到下的掃描進行一個逐步鎖(S鎖)的過程,隨著時間的推移它最終就會變為全表鎖。

而insert語句也因為對于插入數量未知而上全表鎖,進而長期持有auto-inc鎖,當然因為insert的表是用于遷移備份數據的,auto-inc鎖的長時間持有對于業務來說影響不大。

id|select_type|table                |partitions|type|possible_keys|key|key_len|ref|rows   |filtered|Extra|
--+-----------+---------------------+----------+----+-------------+---+-------+---+-------+--------+-----+
 1|INSERT     |batch_insert_test_bak|          |ALL |             |   |       |   |       |        |     |
 1|SIMPLE     |batch_insert_test    |          |ALL |             |   |       |   |4692967|   100.0|     |

而select則不同,select查詢操作上的是讀鎖也就是S鎖,這使得其他事務針對掃描到的數據只能上S鎖不能上X鎖即寫鎖。

通過執行計劃可以看到我們的操作是全表掃描ALL,這也就意味著該查詢逐步上S鎖,導致一段時間后,整張表都被鎖住,使得我們的新的會話的插入語句的事務無法提交。進而導致大量連接數阻塞積壓,各種超時問題也就隨之誕生,嚴重一點就很可能導致整個業務線癱瘓:

解決方案

所以如果我們希望遷移時不鎖住全表,可以在指定在每次遷移時指定一個范圍,所以我們針對時間字段增加索引,通過縮小范圍加索引查詢避免全表鎖:

ALTER TABLE db1.batch_insert_test DROP INDEX batch_insert_test_create_date_IDX;
CREATE INDEX batch_insert_test_create_date_IDX USING BTREE ON db1.batch_insert_test (create_date);

然后遷移的sql改為:

insert into batch_insert_test_bak   select * from batch_insert_test where create_date <now() ;

查看執行計劃發現,select走了range索引,避免全表掃描,解決了上述的風險:

id|select_type|table                |partitions|type |possible_keys                    |key                              |key_len|ref|rows|filtered|Extra                |
--+-----------+---------------------+----------+-----+---------------------------------+---------------------------------+-------+---+----+--------+---------------------+
 1|INSERT     |batch_insert_test_bak|          |ALL  |                                 |                                 |       |   |    |        |                     |
 1|SIMPLE     |batch_insert_test    |          |range|batch_insert_test_create_date_IDX|batch_insert_test_create_date_IDX|6      |   |   1|   100.0|Using index condition|

小結

由此可以得出,再使用數據insert into ...... select進行數據遷移時,無比考慮讀寫鎖的工作機制,以及遷移可能導致的鎖的粒度和范圍,只有精確的評估風險點才能保證功能上限不影響正常業務的工作。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2025-02-13 07:49:18

2016-10-20 15:27:18

MySQLredo死鎖

2024-08-27 22:04:37

2023-07-03 07:27:41

進程線程Win32

2020-10-15 06:56:51

MySQL排序

2022-01-28 08:47:25

軟件系統重構

2022-11-02 08:51:01

2023-12-07 07:26:04

2022-12-26 08:13:54

子查詢MySQL

2021-04-23 10:31:18

MySQLRole數據庫

2021-07-30 10:33:57

MySQL觸發器數據

2021-03-01 18:37:15

MySQL存儲數據

2017-12-26 10:19:14

大數據問題缺陷

2020-09-15 12:45:48

系統LinuxUnix

2022-01-11 15:44:15

JavaScript圖表庫數據

2023-09-21 23:08:36

MySQL數據庫死鎖

2021-06-08 08:38:36

MySQL數據庫死鎖問題

2021-08-04 10:15:14

Go路徑語言

2022-06-27 07:50:16

鏈表節點測試

2022-09-19 16:24:33

數據可視化Matplotlib工具
點贊
收藏

51CTO技術棧公眾號

日本福利片在线观看| 一道本在线免费视频| 欧美色18zzzzxxxxx| 免费亚洲电影在线| 日本在线免费播放| 色婷婷视频在线| 六月天综合网| 国产成人免费在线观看| 免费av一区二区| 欧美一级片黄色| 欧美成人毛片| 偷拍一区二区三区四区| 日韩精品一线二线三线| 精品人妻一区二区三区含羞草| 99视频一区| 日韩小视频网址| 国产精品300页| 伊人久久大香线蕉综合影院首页| 亚洲电影在线播放| 在线不卡日本| 邻居大乳一区二区三区| 国产精品主播直播| 国产成人在线视频| 国产真人真事毛片| 久久中文字幕av一区二区不卡| 亚洲精品国产精品乱码不99按摩 | 香蕉久久一区二区不卡无毒影院| 神马影院我不卡| 午夜视频www| 国产激情视频一区二区在线观看| 国产精品国产福利国产秒拍| www.av麻豆| 国产精品www994| 久久精品99无色码中文字幕| 国产精品探花一区二区在线观看| 99国产精品久久一区二区三区| 欧美日本在线播放| 我要看一级黄色大片| 欧美三级网站| 午夜精品福利一区二区三区蜜桃| 麻豆传媒网站在线观看| 免费看美女视频在线网站| 国产欧美视频一区二区三区| 欧美精品一区二区视频 | 亚洲人成77777在线观看网| 国产精品嫩草69影院| 成人豆花视频| 欧美日韩五月天| 欧美日韩大尺度| 东京一区二区| 色久综合一二码| 国产91对白刺激露脸在线观看| 国产精品69xx| 亚洲成a人片在线不卡一二三区| 天天想你在线观看完整版电影免费| 免费日本一区二区三区视频| 中文字幕中文字幕一区| 中文字幕在线观看一区二区三区| 欧美成人三区| 亚洲人成7777| 成人国产一区二区三区| 美女网站视频在线| 午夜精品影院在线观看| 国产精品无码人妻一区二区在线| 黄毛片在线观看| 欧美视频中文在线看| 狠狠爱免费视频| 亚洲第一影院| 欧美日本视频在线| 91丨porny丨九色| 国产精品自在线拍| 国产午夜精品理论片a级探花| 人妻体内射精一区二区| 青青一区二区三区| 久久中文字幕在线| 精品处破女学生| 亚欧美中日韩视频| 国产精品一区二区三区免费视频 | 精品无码三级在线观看视频| 亚洲xxxx在线| 欧洲天堂在线观看| 国产精品国产精品国产专区不片| 青青草免费在线视频观看| 超碰在线网站| 日本精品一级二级| 成人高清在线观看视频| 久久亚洲道色| 中文字幕久热精品在线视频| 亚洲av鲁丝一区二区三区 | 国产 porn| 日韩视频在线直播| 亚洲精品中文字幕女同| 91视频青青草| 国产精品三上| 91久久久在线| 欧美日本韩国一区二区| 成人免费一区二区三区在线观看| 日韩视频免费播放| 国产精品成人国产| 精品国产伦一区二区三区免费| 蜜桃精品成人影片| 亚洲一区在线| 国产91久久婷婷一区二区| 国产又粗又猛又黄又爽| 99久久国产综合精品麻豆| 影音先锋欧美在线| 鲁鲁在线中文| 欧美一区二区免费| 日韩视频在线观看免费视频| 伊人久久大香线蕉综合热线| 国产精品一久久香蕉国产线看观看| 国产小视频一区| 国产精品网曝门| 18禁免费观看网站| 99视频这里有精品| 亚洲精品天天看| 精品亚洲永久免费| 久久精品国产77777蜜臀| 久久er99热精品一区二区三区 | 国产综合在线看| 国产精品爽爽久久久久久| 久久精品一区八戒影视| www.99热这里只有精品| 国产一区2区在线观看| 国产亚洲激情视频在线| 少妇一级淫片免费放中国| 国产一区亚洲一区| 亚洲一区二区免费视频软件合集| 日本在线啊啊| 亚洲精品久久久久久久久久久| 青草草在线视频| 国产乱理伦片在线观看夜一区| 日韩亚洲欧美精品| 日本精品不卡| 亚洲美女动态图120秒| 国产精选第一页| 国产成人午夜99999| 国产一二三四五| 国产精品亚洲综合在线观看| 日韩一区二区福利| 一本色道久久综合亚洲| 中文字幕巨乱亚洲| 欧美日韩在线观看不卡| 精品国产一级毛片| 国产成人精品视频| 第九色区av在线| 欧美在线你懂的| 刘亦菲国产毛片bd| 美女脱光内衣内裤视频久久影院| 欧美日韩综合网| 成人激情综合| 日韩在线精品视频| 国产精品久久久久毛片| 中文字幕一区二区在线播放| 青青草原国产在线视频| 久久看人人摘| 亚洲精品免费在线视频| 四虎av在线| 欧美精品一区二区三区高清aⅴ | 欧美日韩成人在线一区| 三级黄色在线观看| 国产真实乱对白精彩久久| 韩国黄色一级大片| 9l视频自拍蝌蚪9l视频成人| 97av在线视频免费播放| 男人久久精品| 欧美日免费三级在线| 亚洲人与黑人屁股眼交| 国产不卡在线视频| 好吊妞无缓冲视频观看| 国产在线观看91一区二区三区| 国产精品成人aaaaa网站| 在线观看av的网站| 欧美一三区三区四区免费在线看 | 午夜不卡视频| 日韩精品中文字幕一区二区三区 | 嫩草成人www欧美| 午夜午夜精品一区二区三区文| 欧洲亚洲精品久久久久| 久久91超碰青草是什么| 午夜成人鲁丝片午夜精品| 色爱区综合激月婷婷| 午夜精品一区二区三级视频| 大美女一区二区三区| 97成人在线观看视频| 久久中文字幕二区| 精品视频第一区| 欧美视频精品| 久久久久久久亚洲精品| 天天干免费视频| 欧美日韩精品一区二区三区蜜桃 | 色国产精品一区在线观看| 老司机成人免费视频| 成人av在线观| 国产精品天天av精麻传媒| 亚洲一级毛片| 色99中文字幕| 久久久久久毛片免费看| 成人国产精品av| 欧美自拍电影| 久久欧美在线电影| 黄网站在线播放| 亚洲国产精彩中文乱码av在线播放| 中文字幕 自拍偷拍| 亚洲sss视频在线视频| 91ts人妖另类精品系列| 99国产一区二区三精品乱码| 手机在线国产视频| 视频一区中文字幕国产| a级黄色小视频| 久久精品青草| 日本福利一区二区三区| 国产精品三p一区二区| 国产欧美日韩精品专区| 亚洲性受xxx喷奶水| 久久久久国色av免费观看性色| av网站无病毒在线| 日韩av在线直播| 亚洲av无码国产综合专区| 欧美日韩不卡在线| 精品国产乱子伦| 精品免费在线观看| 黄网站免费在线| 亚洲欧美日韩综合aⅴ视频| 免费视频91蜜桃| 久久久99久久| 中文字幕一二三四区| 成人av在线一区二区三区| 原创真实夫妻啪啪av| 久久99国产精品久久99果冻传媒| 妞干网在线免费视频| 国产精品视频| 高清在线观看免费| 亚洲国产日本| 人妻夜夜添夜夜无码av| 欧美日韩三区| 久久久久久久香蕉| 欧美 日韩 国产 一区| 天天干天天操天天干天天操| 91综合久久| 黄色一级片网址| 91精品国产自产在线观看永久∴| 亚洲精品成人a8198a| 日韩综合精品| 一本二本三本亚洲码| 久久久久免费av| 天天综合五月天| 黄色成人精品网站| 搞av.com| 免费看的黄色欧美网站| 国语对白做受xxxxx在线中国| 久久字幕精品一区| 超碰av在线免费观看| 久久精品国产在热久久| 亚洲综合婷婷久久| 激情欧美一区二区三区在线观看| 一级黄色片国产| 国产精品亚洲第一区在线暖暖韩国| 亚洲黄色片免费看| 国产剧情一区二区三区| 亚洲成a人片在线www| av高清久久久| 中文字幕被公侵犯的漂亮人妻| 国产欧美一区二区三区网站| 亚洲色图27p| 亚洲一级二级在线| 九九热在线免费观看| 色哟哟在线观看一区二区三区| 亚洲av无码乱码国产精品fc2| 欧美日韩一区二区在线观看| av网站在线观看免费| 亚洲电影第1页| 国产精品99999| 久久综合电影一区| 亚洲电影观看| 国产欧美精品一区二区三区-老狼| 日本亚州欧洲精品不卡| 久久99九九| 久久综合成人| 国产一级爱c视频| 日韩激情在线观看| 午夜视频在线免费看| 久久久久久久性| 午夜免费激情视频| 一本大道av一区二区在线播放| 一级爱爱免费视频| 亚洲国产成人久久综合| h视频在线播放| 久久久亚洲国产| 中文幕av一区二区三区佐山爱| 国产v亚洲v天堂无码| 精品国产一区二区三区| 国产精品videossex国产高清| 天堂成人免费av电影一区| 性高潮久久久久久| 国产欧美日韩综合| 日本一二三区不卡| 在线播放中文字幕一区| 日本免费不卡| 欧美激情在线观看视频| 欧美aaaaaa| 欧美日韩精品不卡| 激情一区二区| av中文字幕网址| 国产亚洲精品aa午夜观看| 国产亚洲精品码| 91精品国模一区二区三区| 日韩亚洲视频在线观看| 欧美丰满片xxx777| 成人动漫视频在线观看| 日韩av电影免费播放| 在线欧美一区| 乳色吐息在线观看| 亚洲欧美自拍偷拍| 无码任你躁久久久久久久| 精品日韩一区二区三区免费视频| 在线观看免费黄视频| 日韩av电影手机在线| 国产精品网在线观看| 国产精品一二三在线观看| 青青草国产成人99久久| www.久久av| 欧美日韩国产区| 成人免费视频国产免费麻豆| 久久精品视频va| 巨大黑人极品videos精品| 日韩av不卡播放| 日日夜夜免费精品| 欧美图片一区二区| 欧美日韩免费一区| 人人妻人人澡人人爽人人欧美一区| 久久在线免费观看视频| 精品一区二区三区亚洲| 国产一二三四五| 国产精品一区二区黑丝| 一起操在线播放| 777欧美精品| 老司机精品视频在线观看6| 91精品国产综合久久久久久久久| 精品一区二区三区的国产在线观看| a√天堂在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 欧美超碰在线| 日本中文字幕二区| 成人欧美一区二区三区黑人麻豆| 国产又黄又大又爽| 久久国产色av| 日韩精品一区二区三区中文 | 亚洲欧美精品久久| 欧美精品三级日韩久久| 黄色网页在线看| 91传媒视频免费| 激情综合电影网| 在线观看国产网站| 色噜噜久久综合| 在线观看免费版| 99re在线观看视频| 99日韩精品| 在线观看亚洲大片短视频| 欧美另类久久久品| 在线中文字幕第一页| 精品久久蜜桃| 肉色丝袜一区二区| 内射一区二区三区| 精品国产青草久久久久福利| 免费h在线看| 亚洲第一导航| 国产乱码字幕精品高清av| 国产一级片免费看| 亚洲人成网站在线播| 久久av影院| 免费网站在线观看视频| 久久综合中文字幕| 一区二区三区免费观看视频| 久久99精品久久久久久琪琪| 加勒比色老久久爱综合网| 蜜臀久久99精品久久久酒店新书| 国产精品每日更新| 亚洲国产视频一区二区三区| 日本高清不卡在线| 99热在线成人| 看全色黄大色黄女片18| 在线视频你懂得一区| av观看在线| 欧美成人dvd在线视频| 久久国产精品免费| 日韩精品乱码久久久久久| 国产一区二区日韩| 999久久久精品一区二区| 日韩在线第三页| 一区二区三区四区av| 国产小视频福利在线| 99九九视频| 麻豆专区一区二区三区四区五区| 国产在线一区视频| 色婷婷久久一区二区| 日韩三级毛片| 麻豆精品国产传媒| 欧美色成人综合| 日韩精品极品|