批量replace into出現死鎖,整體資料中不存在主鍵相同的資料,唯一索引有兩個`name`索引(組合索引:name+source_flag)和index_property2索引(組合索引:id+ property2),其中id是主鍵。標紅的是name和source_flag欄位,標綠的是id和property2欄位
REPLACE INTO company(id,base,NAME,legal_person_id,legal_person_name,legal_person_type,reg_number,company_type,company_org_type,reg_location,estiblish_time,from_time,to_time,business_scope,reg_institute,approved_time,reg_status,reg_capital,actual_capital,org_number,org_approved_institute,flag,parent_id,updatetime,list_code,ownership_stake,source_flag,name_suffix,property1,property2,property3,property4,property5,crawledtime)
VALUES('139224108','sd','津津保險公司','25955644','錢司均','1','37040011117153','0','其他股份有限公司分公司(非上市)','山東省棗莊市高新區錦水長街互聯網小鎮5號樓B座202號','2017-10-25','2017-10-25',NULL,'為投保人擬定投保方案、選擇保險人、辦理投保手續;協助被保險人或受益人進行索賠;為委托人提供防災、防損或風險評估、風險管理咨詢服務。(依法須經批準的專案,經相關部門批準后方可開展經營活動)','棗莊市工商行政管理局','2017-10-25','在營','','','MA3EQ2TP1','','1','506086','2018-04-01','','','http://qyxy.baic.gov.cn/','','91370400MA3EQ2TP1R','','','','','2017-10-30');
REPLACE INTO company(id,base,NAME,legal_person_id,legal_person_name,legal_person_type,reg_number,company_type,company_org_type,reg_location,estiblish_time,from_time,to_time,business_scope,reg_institute,approved_time,reg_status,reg_capital,actual_capital,org_number,org_approved_institute,flag,parent_id,updatetime,list_code,ownership_stake,source_flag,name_suffix,property1,property2,property3,property4,property5,crawledtime)
VALUES('50207412', 'gd', '潮州市潮安區潔廈瓷業有限公司', '10433735', '蔡映秋', '1', '445121000045309', '0', '有限責任公司(自然人投資或控股)', '潮州市潮安區鳳塘鎮泮洋村沙堀片', '2000-12-19', '2000-12-19',NULL, '生產:陶瓷衛生潔具、日用瓷、瓷釉(不含危險品及涉及污染物排放)、瓷泥、陶器;銷售:水暖器材、不銹鋼制品、五金交電、家用電器、塑料制品。(依法須經批準的專案,經相關部門批準后方可開展經營活動)', '廣東省潮州市潮安縣工商行政管理局', '2018-04-11', '在營(開業)企業', '2000萬人民幣','', '41741471','', '1', '0', '2018-09-06','','', 'http://qyxy.baic.gov.cn/','', '91445103741741471L','', 'Jiexia Ceramic Industry Co.,Ltd.','','', '2018-09-06')
日志截圖如下

uj5u.com熱心網友回復:
replace into 本身就容易引起死鎖, 你還搞那么多唯一項, 你要 mysql 按哪個是好?你這種情況, 直接用 update + insert 就是了。
start transaction;
update tb set xxx where a=@a and b=@b;
insert tb select * from( select @a as a, @b as b ) x where row_count()=0;
commit
uj5u.com熱心網友回復:
這是在坑自己,匯入到另一個schema下,然后再用陳述句 insert 多好uj5u.com熱心網友回復:
我用java代碼批量提交的時候,試過根據id查詢,如果id對于的資料存在則更新,不存在則洗掉,但是仍然會死鎖
uj5u.com熱心網友回復:
至少比你現在這樣要好吧。
對于非常繁忙、資料量大的系統, 不適合大表, 不適合太多索引。
id 是主鍵, 本身就能保證唯一, 還要增加 組合索引:id+ property2 干啥?
主鍵一般不要再和其它欄位再做索引。
你現在的表有多大?
另外, 查詢最好是:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
uj5u.com熱心網友回復:
replace into 本身就容易引起死鎖, 你還搞那么多唯一項, 你要 mysql 按哪個是好?
你這種情況, 直接用 update + insert 就是了。
start transaction;
update tb set xxx where a=@a and b=@b;
insert tb select * from( select @a as a, @b as b ) x where row_count()=0;
commit
我用java代碼批量提交的時候,試過根據id查詢,如果id對于的資料存在則更新,不存在則洗掉,但是仍然會死鎖
至少比你現在這樣要好吧。
對于非常繁忙、資料量大的系統, 不適合大表, 不適合太多索引。
id 是主鍵, 本身就能保證唯一, 還要增加 組合索引:id+ property2 干啥?
主鍵一般不要再和其它欄位再做索引。
你現在的表有多大?
另外, 查詢最好是:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
表目前資料量沒做統計,但是每天更新的資料量比較大,大概一天3-4G左右
uj5u.com熱心網友回復:
replace into 本身就容易引起死鎖, 你還搞那么多唯一項, 你要 mysql 按哪個是好?
你這種情況, 直接用 update + insert 就是了。
start transaction;
update tb set xxx where a=@a and b=@b;
insert tb select * from( select @a as a, @b as b ) x where row_count()=0;
commit
我用java代碼批量提交的時候,試過根據id查詢,如果id對于的資料存在則更新,不存在則洗掉,但是仍然會死鎖
至少比你現在這樣要好吧。
對于非常繁忙、資料量大的系統, 不適合大表, 不適合太多索引。
id 是主鍵, 本身就能保證唯一, 還要增加 組合索引:id+ property2 干啥?
主鍵一般不要再和其它欄位再做索引。
你現在的表有多大?
另外, 查詢最好是:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
關鍵是這個表不是我們這邊的,我沒法修改索引
uj5u.com熱心網友回復:
表目前資料量沒做統計,但是每天更新的資料量比較大,大概一天3-4G左右
這么大資料量的表, 不從設計上去避免, 沒得救了。
該動大手術的就得動, 跟相關負責人溝通下。
這個表, 必須要分表, 當前表只保留一天的資料, 其它的資料分到歷史表中去。
如果能分成: 當前表、當月表、歷史表, 則更好。
用定時任務, 每天定時將資料轉移到歷史表中去。
表小了, 爛七八槽的事情就少很多的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/75176.html
標籤:MySQL
