mysql入庫慢了怎么辦 mysql入庫性能

mysql大量數(shù)據(jù)插入慢的問題

這個是需要做一些設(shè)置的。主要設(shè)置 rewriteBatchedStatements參數(shù)。原理如下:

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計,雞東網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:雞東等地區(qū)。雞東做網(wǎng)站價格咨詢:18982081108

MySQL Jdbc驅(qū)動在默認(rèn)情況下會無視executeBatch()語句,把我們期望批量執(zhí)行的一組sql語句拆散,一條一條地發(fā)給MySQL數(shù)據(jù)庫,直接造成較低的性能。

只有把rewriteBatchedStatements參數(shù)置為true, 驅(qū)動才會幫你批量執(zhí)行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。不過,驅(qū)動具體是怎么樣批量執(zhí)行的? 你是不是需要看一下內(nèi)幕,才敢放心地使用這個選項? 下文會給出答案。

另外,有人說rewriteBatchedStatements只對INSERT有效,有人說它對UPDATE/DELETE也有效。為此我做了一些實驗(詳見下文),結(jié)論是: 這個選項對INSERT/UPDATE/DELETE都有效,只不過對INSERT它為會預(yù)先重排一下SQL語句。

注:本文使用的mysql驅(qū)動版本是5.1.12

實驗記錄:未打開rewriteBatchedStatements時

未打開rewriteBatchedStatements時,根據(jù)wireshark嗅探出的mysql報文可以看出,

batchDelete(10條記錄) = 發(fā)送10次delete 請求

batchUpdate(10條記錄) = 發(fā)送10次update 請求

batchInsert(10條記錄) = 發(fā)送10次insert 請求

也就是說,batchXXX()的確不起作用

實驗記錄:打開了rewriteBatchedStatements后

打開rewriteBatchedStatements后,根據(jù)wireshark嗅探出的mysql報文可以看出

batchDelete(10條記錄) = 發(fā)送一次請求,內(nèi)容為”delete from t where id = 1; delete from t where id = 2; delete from t where id = 3; ….”

batchUpdate(10條記錄) = 發(fā)送一次請求,內(nèi)容為”update t set … where id = 1; update t set … where id = 2; update t set … where id = 3 …”

batchInsert(10條記錄) = 發(fā)送一次請求,內(nèi)容為”insert into t (…) values (…) , (…), (…)”

對delete和update,驅(qū)動所做的事就是把多條sql語句累積起來再一次性發(fā)出去;而對于insert,驅(qū)動則會把多條sql語句重寫成一條風(fēng)格很酷的sql語句,然后再發(fā)出去。 官方文檔說,這種insert寫法可以提高性能(”This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements”)

一個注意事項

需要注意的是,即使rewriteBatchedStatements=true, batchDelete()和batchUpdate()也不一定會走批量: 當(dāng)batchSize = 3時,驅(qū)動會寧愿一條一條地執(zhí)行SQL。所以,如果你想驗證rewriteBatchedStatements在你的系統(tǒng)里是否已經(jīng)生效,記得要使用較大的batch.

更多細(xì)節(jié)看這個帖子:

blog.yemou.net/article/query/info/tytfjhfascvhzxcyt397

mysql數(shù)據(jù)庫插入數(shù)據(jù)很慢

1.逐步排除法,輸出幾個重要步驟的執(zhí)行時間,找出導(dǎo)致代碼執(zhí)行時間慢的真正原因,看看是讀取excel慢還是插入數(shù)據(jù)庫慢或者其他原因

MySQL速度變慢,怎么辦

MySQL 在崩潰恢復(fù)時,會遍歷打開所有 ibd 文件的 header page 驗證數(shù)據(jù)字典的準(zhǔn)確性,如果 MySQL 中包含了大量表,這個校驗過程就會比較耗時。 MySQL 下崩潰恢復(fù)確實和表數(shù)量有關(guān),表總數(shù)越大,崩潰恢復(fù)時間越長。另外磁盤 IOPS 也會影響崩潰恢復(fù)時間,像這里開發(fā)庫的 HDD IOPS 較低,因此面對大量的表空間,校驗速度就非常緩慢。另外一個發(fā)現(xiàn),MySQL 8 下正常啟用時居然也會進(jìn)行表空間校驗,而故障恢復(fù)時則會額外再進(jìn)行一次表空間校驗,等于校驗了 2 遍。不過 MySQL 8.0 里多了一個特性,即表數(shù)量超過 5W 時,會啟用多線程掃描,加快表空間校驗過程。

如何跳過校驗MySQL 5.7 下有方法可以跳過崩潰恢復(fù)時的表空間校驗過程嘛?查閱了資料,方法主要有兩種:

1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那么 validate = false,即可以跳過表空間校驗。實際測試的時候設(shè)置 innodb_force_recovery =1,也就是強制恢復(fù)跳過壞頁,就可以跳過校驗,然后重啟就是正常啟動了。通過這種臨時方式可以避免崩潰恢復(fù)后非常耗時的表空間校驗過程,快速啟動 MySQL,個人目前暫時未發(fā)現(xiàn)有什么隱患。2. 使用共享表空間替代獨立表空間這樣就不需要打開 N 個 ibd 文件了,只需要打開一個 ibdata 文件即可,大大節(jié)省了校驗時間。自從聽了姜老師講過使用共享表空間替代獨立表空間解決 drop 大表時性能抖動的原理后,感覺共享表空間在很多業(yè)務(wù)環(huán)境下,反而更有優(yōu)勢。

臨時冒出另外一種解決想法,即用 GDB 調(diào)試崩潰恢復(fù),通過臨時修改 validate 變量值讓 MySQL 跳過表空間驗證過程,然后讓 MySQL 正常關(guān)閉,重新啟動就可以正常啟動了。但是實際測試發(fā)現(xiàn),如果以 debug 模式運行,確實可以臨時修改 validate 變量,跳過表空間驗證過程,但是 debug 模式下代碼運行效率大打折扣,反而耗時更長。而以非 debug 模式運行,則無法修改 validate 變量,想法破滅。

新聞名稱:mysql入庫慢了怎么辦 mysql入庫性能
URL分享:http://muchs.cn/article14/dohdsge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站建設(shè)搜索引擎優(yōu)化、定制網(wǎng)站、微信公眾號外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)