电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MySql 如何實(shí)現(xiàn)無(wú)則插入有則更新

瀏覽:14日期:2023-10-01 17:37:31
摘要

某些場(chǎng)景會(huì)有這樣的需求:無(wú)記錄則插入,有記錄則更新。例如:新增用戶,以身份證號(hào)碼作為唯一身份標(biāo)識(shí),插入時(shí)若先查詢是否存在記錄再?zèng)Q定插入還是更新,在高并發(fā)情況下必然存在問題。本文提供三種解決方案。

方案一 加鎖

無(wú)論通過(guò)synchronized鎖、ReentranLock鎖還是分布式鎖,都可以解決該問題。缺點(diǎn)是,加鎖會(huì)影響性能。方法二和三都是數(shù)據(jù)庫(kù)層面解決方案,個(gè)人感覺比方法一好一些。

方案二 Unique和Replace Into … SELECT …

首先對(duì)唯一性的字段添加唯一索引ALTER TABLE tb_name ADD UNIQUE (col1、col2...),,通過(guò)唯一索引即可保證數(shù)據(jù)的唯一性。

加入唯一索引后,通過(guò)INSERT INTO插入相同數(shù)據(jù)就會(huì)報(bào)錯(cuò),此時(shí)需要使用REPLACE INTO插入數(shù)據(jù),用法是一樣的。通過(guò)REPLACE INTO插入數(shù)據(jù)時(shí),若存在相同數(shù)據(jù),會(huì)將之前的記錄刪除,再重新插入數(shù)據(jù)。缺點(diǎn)是,存在先刪除再插入的過(guò)程,sql需要考慮全部數(shù)據(jù)列,不然會(huì)丟失部分列的數(shù)據(jù)。缺點(diǎn)是,建立唯一索引會(huì)影響插入效率。下面是具體的例子。

# 建立索引ALTER TABLE user ADD UNIQUE (id_card);# 假設(shè)user表只有id,name,id_card三個(gè)字段,且id字段自增。# 現(xiàn)在需要插入name=ly,id_card=142733的記錄。# 但是,若之前存在id_card=142733的記錄,修改name=ly即可。REPLACE INTO user (id,name,id_card) SELECT id,’ly’,142733 FROM user RIGHT JOIN (SELECT 1) AS tab ON user.id_card = 142733;

通過(guò)RIGHT JOIN (SELECT 1),若存在id_card=142733的記錄,執(zhí)行sql后會(huì)將原始id保存在臨時(shí)的結(jié)果集中,隨name和id_card一同插入。若不存在該記錄,則將null作為id隨name和id_card一同插入。最終實(shí)現(xiàn)

方案三 通過(guò)預(yù)插入語(yǔ)句判斷是否存在記錄

通過(guò)預(yù)插入語(yǔ)句,嘗試插入,判斷修改的記錄是否大于0,若大于0表示插入成功,若為0則表示記錄已存在,需要執(zhí)行更新操作。

# 預(yù)插入INSERT INTO user (name,id_card)SELECT ’ly’,142733 FROM DUAL WHERE NOT EXISTE (SELECT id_card FROM user WHERE id_card = 142733) ;# 若預(yù)插入語(yǔ)句插入成功(修改記錄數(shù)=1),則無(wú)需后續(xù)操作。否則執(zhí)行更新操作。UPDATE user SET name = ’ly’ WHERE id_card = 142733;

通過(guò)NOT EXISTE條件,若存在id_card=142733的記錄則偽表DUAL記錄為空,預(yù)插入語(yǔ)句修改記錄為0,此時(shí)需要執(zhí)行更新操作。

若不存在id_card=142733的記錄,則偽表DUAL記錄為一行且內(nèi)容是’ly’,142733,預(yù)插入語(yǔ)句修改記錄為1,此時(shí)不必執(zhí)行更新語(yǔ)句。

Mysql批量插入更新性能優(yōu)化

對(duì)于數(shù)據(jù)量較大的插入和更新,因io/cpu等性能瓶頸,會(huì)產(chǎn)生大量的時(shí)間消耗,目前主流的優(yōu)化主要包括預(yù)編譯、單條sql插入多條數(shù)據(jù)、事務(wù)插入等,下面詳細(xì)介紹一下:

單條插入(Mybatis)

INSERT INTO SYS_CITY (CITY_CODE, CITY_NAME, PROVINCE_NAME, ALIAS, ABBRE_PY) VALUES(${cityCode}, ${cityName}, ${provinceName}, ${alias}, ${abbrePy})單條預(yù)編譯插入(Mybatis)

采用預(yù)編譯可以節(jié)約mysql服務(wù)的解析時(shí)間,mytatis中就是采用#變量

INSERT INTO SYS_CITY (CITY_CODE, CITY_NAME, PROVINCE_NAME, ALIAS, ABBRE_PY) VALUES(#{cityCode}, #{cityName}, #{provinceName}, #{alias}, #{abbrePy})單條sql插入多條數(shù)據(jù)

即是拼接sql,在一個(gè)sql中插入多條或更新多條數(shù)據(jù)。

INSERT INTO SYS_CITY (CITY_CODE, CITY_NAME, PROVINCE_NAME, ALIAS, ABBRE_PY) VALUES('cityCode1', 'cityName1', 'provinceName1' 'alias1', 'abbrePy1'),('cityCode2', 'cityName2', 'provinceName2' 'alias2', 'abbrePy2')

快的原因

1、合并后日志量(MySQL的binlog和innodb的事務(wù)讓日志)減少了,降低日志刷盤的數(shù)據(jù)量和頻率,從而提高效率;

2、通過(guò)合并SQL語(yǔ)句,減少網(wǎng)絡(luò)傳輸?shù)腎O;

3、通過(guò)合并SQL語(yǔ)句,減少SQL語(yǔ)句解析的次數(shù);

注意事項(xiàng)

1、數(shù)據(jù)庫(kù)sql長(zhǎng)度是有限制,sql長(zhǎng)度別溢出,會(huì)報(bào)錯(cuò);

2、亂序插入時(shí)候速度超過(guò)innodb_buffer的容量,每次定位索引涉及較多的磁盤讀寫操作,性能下降較快;

事務(wù)插入

事務(wù)插入即在插入前開啟事務(wù),插入結(jié)束關(guān)閉事務(wù)進(jìn)行提交即可。

快的原因

1、進(jìn)行一個(gè)INSERT操作時(shí),MySQL內(nèi)部會(huì)建立一個(gè)事務(wù),在事務(wù)內(nèi)才進(jìn)行真正插入處理操作。通過(guò)使用事務(wù)可以減少創(chuàng)建事務(wù)的消耗;

注意事項(xiàng)

1、事務(wù)不能過(guò)大,MySQL有innodb_log_buffer_size配置項(xiàng),事務(wù)超出這個(gè)時(shí),會(huì)刷磁盤,導(dǎo)致性能下降;

2、亂序插入時(shí)候速度超過(guò)innodb_buffer的容量,每次定位索引涉及較多的磁盤讀寫操作,性能下降較快;

測(cè)試結(jié)果

環(huán)境:i5-4200U 1.6GHZ,12G內(nèi)存,固態(tài)硬盤

:單條插入: :單條預(yù)編譯: :單條插入多條: :事務(wù)插入: 1000 4600毫秒 3334毫秒 8毫秒 704毫秒 10000 27204毫秒 26249毫秒 2959毫秒 2959毫秒 100000 240954毫秒 254716毫秒 17286毫秒 20539毫秒 總結(jié)

采用合并sql+事務(wù)插入組合,效率最高,亂序插入時(shí)候速度超過(guò)innodb_buffer的容量,每次定位索引涉及較多的磁盤讀寫操作,性能下降較快;盡量采用非亂序方式即可。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
主站蜘蛛池模板: 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 神马影院-实时更新秒播| 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 阜阳在线-阜阳综合门户 | 客服外包专业服务商_客服外包中心_网萌科技 | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | 卫浴散热器,卫浴暖气片,卫生间背篓暖气片,华圣格浴室暖气片 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 | 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 船用锚链|专业锚链生产厂家|安徽亚太锚链制造有限公司 | TPE塑胶原料-PPA|杜邦pom工程塑料、PPSU|PCTG材料、PC/PBT价格-悦诚塑胶 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 创客匠人-让IP变现不走弯路| 陕西安闸机-伸缩门-车牌识别-广告道闸——捷申达门业科技 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | C形臂_动态平板DR_动态平板胃肠机生产厂家制造商-普爱医疗 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 好看的韩国漫画_韩漫在线免费阅读-汗汗漫画| 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 中细软知识产权_专业知识产权解决方案提供商| 电动葫芦|环链电动葫芦-北京凌鹰名优起重葫芦 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 土壤墒情监测站_土壤墒情监测仪_土壤墒情监测系统_管式土壤墒情站-山东风途物联网 |