mysql中insert?into...select語(yǔ)句優(yōu)化方式
insert into...select語(yǔ)句優(yōu)化
在MySQL中,INSERT INTO ... SELECT 語(yǔ)句可以導(dǎo)致源表(即SELECT部分的表)被鎖定,這主要取決于事務(wù)的隔離級(jí)別以及表的存儲(chǔ)引擎。
例如:
InnoDB存儲(chǔ)引擎在默認(rèn)的可重復(fù)讀(REPEATABLE READ)隔離級(jí)別下會(huì)使用一致性讀(consistent read)
通常不會(huì)鎖定源表中的記錄,但在某些情況下可能會(huì)使用間隙鎖(gap locks)或者next-key鎖,影響到并發(fā)性能。
優(yōu)化INSERT INTO ... SELECT語(yǔ)句的策略
使用低事務(wù)隔離級(jí)別:
- 例如,將隔離級(jí)別設(shè)置為READ COMMITTED可以減少鎖的使用
- 但在修改隔離級(jí)別前需要考慮應(yīng)用程序的整體一致性要求
分批插入:
- 若向目標(biāo)表插入大量數(shù)據(jù),可以考慮將其拆分成多個(gè)小批量的插入操作。
- 這樣可以減少對(duì)源表的鎖定時(shí)間,并降低對(duì)數(shù)據(jù)庫(kù)性能的影響。
優(yōu)化SELECT查詢:
- 確保SELECT部分的查詢被高效執(zhí)行
- 比如使用索引來(lái)減少查詢時(shí)間和鎖定時(shí)間
限制索引鎖:
- 如果使用InnoDB并且確實(shí)出現(xiàn)了間隙鎖定
- 可以通過(guò)優(yōu)化查詢條件來(lái)減少間隙鎖的使用
避免高峰時(shí)段操作:
- 盡量避免在系統(tǒng)負(fù)載高的時(shí)段運(yùn)行大型的INSERT INTO ... SELECT操作。
使用INSERT DELAYED:
- 如果表的存儲(chǔ)引擎支持(如MyISAM)
- 可以使用INSERT DELAYED語(yǔ)句,它將插入操作排隊(duì),減少對(duì)表的即時(shí)鎖定。
調(diào)整鎖等待超時(shí)時(shí)間:
- 如果鎖沖突是一個(gè)問(wèn)題,可以調(diào)整鎖等待的超時(shí)時(shí)間
- 使得鎖定操作在等待太久后能夠失敗并重新嘗試
使用臨時(shí)表:
- 先將數(shù)據(jù)插入到臨時(shí)表中,然后再?gòu)呐R時(shí)表批量轉(zhuǎn)移到目標(biāo)表
- 這種方法可以減少對(duì)原始表的鎖定時(shí)間
考慮使用pt-online-schema-change或gh-ost工具:
- 如果要對(duì)大表進(jìn)行DDL操作并且想要最小化鎖的影響
- 可以使用這些工具進(jìn)行在線DDL更改
需要注意的是,具體的優(yōu)化策略取決于具體的使用場(chǎng)景,性能瓶頸的原因以及數(shù)據(jù)的特點(diǎn)。
因此,實(shí)施任何優(yōu)化之前都應(yīng)該仔細(xì)分析和測(cè)試以確保不會(huì)對(duì)系統(tǒng)的穩(wěn)定性和數(shù)據(jù)的一致性產(chǎn)生負(fù)面影響。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SQL?Server使用SELECT?INTO實(shí)現(xiàn)表備份的代碼示例
- sql中select into和insert select的用法小結(jié)
- MySQL insert into select 主鍵沖突解決方案
- mysql使用insert into select插入查出的數(shù)據(jù)
- SELECT...INTO的具體用法
- 使用MySQL實(shí)現(xiàn)select?into臨時(shí)表的功能
- 用SELECT... INTO OUTFILE語(yǔ)句導(dǎo)出MySQL數(shù)據(jù)的教程
- SELECT INTO用法及支持的數(shù)據(jù)庫(kù)
相關(guān)文章
mysql下普通用戶備份數(shù)據(jù)庫(kù)時(shí)無(wú)lock tables權(quán)限的解決方法
mysql使用普通用戶備份出現(xiàn)無(wú)lock tables權(quán)限的解決方法,需要的朋友可以參考下。2011-10-10
SQL實(shí)現(xiàn)LeetCode(181.員工掙得比經(jīng)理多)
這篇文章主要介紹了SQL實(shí)現(xiàn)LeetCode(181.員工掙得比經(jīng)理多),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
MySQL for update鎖表還是鎖行校驗(yàn)(過(guò)程詳解)
在MySQL中,使用for update子句可以對(duì)查詢結(jié)果集進(jìn)行行級(jí)鎖定,以便在事務(wù)中對(duì)這些行進(jìn)行更新或者防止其他事務(wù)對(duì)這些行進(jìn)行修改,這篇文章主要介紹了MySQL for update鎖表還是鎖行校驗(yàn),需要的朋友可以參考下2024-02-02
單個(gè)select語(yǔ)句實(shí)現(xiàn)MySQL查詢統(tǒng)計(jì)次數(shù)
MySQL中查詢統(tǒng)計(jì)次數(shù)往往語(yǔ)句寫(xiě)法很復(fù)雜,下文就教您一個(gè)只用單個(gè)select語(yǔ)句就實(shí)現(xiàn)的方法,希望對(duì)您能夠有所幫助2014-05-05
ubuntu下磁盤(pán)空間不足導(dǎo)致mysql無(wú)法啟動(dòng)的解決方法
昨天又遇到了MySQL數(shù)據(jù)庫(kù)無(wú)法重啟的問(wèn)題,還以為是權(quán)限的原因,后來(lái)發(fā)現(xiàn)提示是因?yàn)榇疟P(pán)空間不足導(dǎo)致的,通過(guò)查找相關(guān)資料得以解決了,所以下面這篇文章主要介紹了ubuntu下磁盤(pán)空間不足導(dǎo)致mysql無(wú)法啟動(dòng)的解決方法,需要的朋友可以參考下。2017-03-03
MySQL如何創(chuàng)建觸發(fā)器(CREATE TRIGGER)
這篇文章主要介紹了MySQL如何創(chuàng)建觸發(fā)器(CREATE TRIGGER)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Centos中徹底刪除Mysql(rpm、yum安裝的情況)
這篇文章主要介紹了Centos中徹底刪除Mysql(rpm、yum安裝的情況),本文直接給出操作代碼,需要的朋友可以參考下2015-02-02
MySQL如何快速的創(chuàng)建千萬(wàn)級(jí)測(cè)試數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于MySQL如何快速的創(chuàng)建千萬(wàn)級(jí)測(cè)試數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

