MySQL中實現大數據量的快速插入

一、SQL語句優化?

1. ?批量插入代替單條插入?
  • ?單條插入會頻繁觸發事務提交和日志寫入,效率極低。
  • ?批量插入通過合并多條數據為一條SQL語句,減少網絡傳輸和SQL解析開銷。
-- 低效寫法:逐條插入
INSERT INTO table (col1, col2) VALUES (1, 'a');
INSERT INTO table (col1, col2) VALUES (2, 'b');-- 高效寫法:批量插入
INSERT INTO table (col1, col2) VALUES 
(1, 'a'), (2, 'b'), (3, 'c'), ...;
  • ?建議單次插入數據量?:控制在?500~2000?行(避免超出?max_allowed_packet)。
2. ?禁用自動提交(Autocommit)??
  • 默認情況下,每條插入都會自動提交事務,導致頻繁的磁盤I/O。
  • ?手動控制事務,將多個插入操作合并為一個事務提交:
START TRANSACTION;
INSERT INTO table ...;
INSERT INTO table ...;
...
COMMIT;
  • ?注意?:事務過大可能導致?undo log?膨脹,需根據內存調整事務批次(如每?1萬~10萬?行提交一次)。
3. ?**使用?LOAD DATA INFILE**?
  • 從文件直接導入數據,比?INSERT?快 ?20倍以上,跳過了SQL解析和事務開銷。
LOAD DATA LOCAL INFILE '/path/data.csv' 
INTO TABLE table
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';
  • ?適用場景?:從CSV或文本文件導入數據。
4. ?禁用索引和約束?
  • 插入前禁用索引(尤其是唯一索引和全文索引),插入完成后重建:
-- 禁用索引
ALTER TABLE table DISABLE KEYS;
-- 插入數據...
-- 重建索引
ALTER TABLE table ENABLE KEYS;
  • ?禁用外鍵檢查?:
SET FOREIGN_KEY_CHECKS = 0;
-- 插入數據...
SET FOREIGN_KEY_CHECKS = 1;

?二、參數配置優化?

1. ?InnoDB引擎參數調整?
  • ?**innodb_flush_log_at_trx_commit**?:
    • 默認值為?1(每次事務提交都刷盤),改為?0?或?2?可減少磁盤I/O。
    • 0:每秒刷盤(可能丟失1秒數據)。
    • 2:提交時寫入OS緩存,不強制刷盤。
  • ?**innodb_buffer_pool_size**?:
    • 增大緩沖池大小(通常設為物理內存的?70%~80%),提高數據緩存命中率。
  • ?**innodb_autoinc_lock_mode**?:
    • 設為?2(交叉模式),減少自增鎖競爭(需MySQL 8.0+)。
2. ?調整網絡和包大小?
  • ?**max_allowed_packet**?:
    • 增大允許的數據包大小(默認?4MB),避免批量插入被截斷。
  • ?**bulk_insert_buffer_size**?:
    • 增大批量插入緩沖區大小(默認?8MB)。
3. ?其他參數?
  • ?**back_log**?:增大連接隊列長度,應對高并發插入。
  • ?**innodb_doublewrite**?:關閉雙寫機制(犧牲數據安全換取性能)。

?三、存儲引擎選擇?

1. ?MyISAM引擎?
  • ?優點?:插入速度比InnoDB快(無事務和行級鎖開銷)。
  • ?缺點?:不支持事務和崩潰恢復,適合只讀或允許數據丟失的場景。
2. ?InnoDB引擎?
  • ?優點?:支持事務和行級鎖,適合高并發寫入。
  • ?優化技巧?:
    • 使用?innodb_file_per_table?避免表空間碎片。
    • 主鍵使用自增整數(避免隨機寫入導致的頁分裂)。

?四、硬件和架構優化?

1. ?使用SSD硬盤?
  • 替換機械硬盤為SSD,提升I/O吞吐量。
2. ?分庫分表?
  • 將單表拆分為多個子表(如按時間或ID范圍),減少單表壓力。
  • 使用中間件(如ShardingSphere)或分區表(PARTITION BY)。
3. ?讀寫分離?
  • 主庫負責寫入,從庫負責查詢,降低主庫壓力。
4. ?異步寫入?
  • 將數據先寫入消息隊列(如Kafka),再由消費者批量插入數據庫。

?五、代碼層面優化?

1. ?多線程并行插入?
  • 將數據分片,通過多線程并發插入不同分片。
  • ?注意?:需確保線程間無主鍵沖突。
2. ?預處理語句(Prepared Statements)??
  • 復用SQL模板,減少解析開銷:
// Java示例
String sql = "INSERT INTO table (col1, col2) VALUES (?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
for (Data data : list) {ps.setInt(1, data.getCol1());ps.setString(2, data.getCol2());ps.addBatch();
}
ps.executeBatch();

?六、性能對比示例?

優化方法插入10萬條耗時(秒)
逐條插入(默認)120
批量插入(1000行/次)5
LOAD DATA INFILE1.5

?總結?

  • ?核心思路?:減少磁盤I/O、降低鎖競爭、合并操作。
  • ?推薦步驟?:
    1. 優先使用?LOAD DATA INFILE?或批量插入。
    2. 調整事務提交策略和InnoDB參數。
    3. 優化表結構(禁用非必要索引)。
    4. 根據硬件和場景選擇存儲引擎。
    5. 在架構層面分庫分表或異步寫入。

通過上述方法,可在MySQL中實現每秒數萬甚至數十萬條的高效插入。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81904.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++23中std::span和std::basic_string_view可平凡復制提案解析

文章目錄 一、引言二、相關概念解釋2.1 平凡復制(Trivially Copyable)2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的應用場景3.1 std::span的應用場景3.2 std::basic_string_view的應用場景 四、P2251R1提案對std::…

廣東省省考備考(第十八天5.23)—言語:語句填空題(聽課后強化訓練)

錯題 解析 橫線出現在文段中間,需結合上下文內容進行分析。文段開篇指出逃離北上廣深的話題時而出現,一些人離開大城市回到小城市。隨后通過轉折詞“但”引出橫線內容,且結合橫線后人才傾向于向更發達的地方流動的內容,橫線處應體…

持續更新 ,GPT-4o 風格提示詞案例大全!附使用方式

本文匯集了各類4o風格提示詞的精選案例,從基礎指令到復雜任務,從創意寫作到專業領域,為您提供全方位的參考和靈感。我們將持續更新這份案例集,確保您始終能夠獲取最新、最有效的提示詞技巧。 讓我們一起探索如何通過精心設計的提…

創建型:建造者模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 工作流程 2.3 實現案例 2.4 變體:鏈式建造者(常見于多參數對象,無需指揮者) 3、優缺點分析 4、適用場景 1、核心思想 目的:將復雜對象的構建過程與其表示分離…

力扣-長度最小的子數組

1.題目描述 2.題目鏈接 LCR 008. 長度最小的子數組 - 力扣(LeetCode) 3.題目分析 這道題目我們使用的也是雙指針。我們可以定義兩個指針都指向數組第一個元素,然后使用right指針遍歷原數組,計算left指針到right指針之間的所有元…

JAVA開發工具延長方案

親測穩定的延長方案與避坑指南 真的搞不懂了,說點專業的術語竟然成了 QINQUAN。那就直接點,把這個方案帶給需要的開發者。 延長工具直通車 保姆級教程 延長方案https://mp.weixin.qq.com/s/uajM2Y9Vz6TnolzcLur_bw還是讓大家看看,發什么會被…

SpringAI開發SSE傳輸協議的MCP Server

SpringAI 訪問地址:Spring AI ? Spring AI?是一個面向人工智能工程的應用框架,由Spring團隊推出,旨在將AI能力集成到Java應用中。Spring AI的核心是解決AI集成的根本挑戰,即將企業數據和API與AI模型連接起來?。 MCP…

JAVA動態生成類

在java的加載過程一般都是要預先定義java類,然后通過經過加載->連接->初始化三步。連接過程又可分為三步:驗證->準備->解析。初始化的類是不允許修改。但是在日常的工作中有時候需要動態生成類,那第這種情況怎么辦呢? 可以這么處理: 1、先定義一個空的類,僅…

深入解析Java微服務架構:Spring Boot與Spring Cloud的整合實踐

深入解析Java微服務架構:Spring Boot與Spring Cloud的整合實踐 引言 隨著云計算和分布式系統的快速發展,微服務架構已成為現代軟件開發的主流模式。Java作為企業級應用開發的核心語言,結合Spring Boot和Spring Cloud,為開發者提…

03_基礎篇-NumPy(下):深度學習中的常用操作

03_基礎篇-NumPy(下):深度學習中的常用操作 通過上節課的學習,我們已經對NumPy數組有了一定的了解,正所謂實踐出真知,今天我們就以一個圖像分類的項目為例,看看NumPy的在實際項目中都有哪些重要…

時鐘識別項目報告(深度學習、計算機視覺)

深度學習方式 一、模型架構 本模型采用雙任務學習框架,基于經典殘差網絡實現時鐘圖像的小時和分鐘同步識別。 主干網絡 使用預訓練的ResNet18作為特征提取器,移除原分類層(fc層),保留全局平均池化后的512維特征向量。…

openai-whisper-asr-webservice接入dify

openai-whisper-asr-webservice提供的asr的api其實并不兼容openai的api,所以在dify中是不能直接添加到語音轉文字的模型中,對比了下兩個api的傳參情況,其實只要改動一處,就能支持: openai兼容的asr調用中formdata中音頻…

解鎖MySQL性能調優:高級SQL技巧實戰指南

高級SQL技巧:解鎖MySQL性能調優的終極指南 開篇 當前,隨著業務系統的復雜化和數據量的爆炸式增長,數據庫性能調優成為了技術人員面臨的核心挑戰之一。尤其是在高并發、大數據量的場景下,SQL 查詢的性能直接影響到整個系統的響應…

JavaScript 性能優化實戰指南

JavaScript 性能優化實戰指南 前言 隨著前端應用復雜度提升,JavaScript 性能瓶頸日益突出。高效的性能優化不僅能提升用戶體驗,還能增強系統穩定性和可維護性。本文系統梳理了 JavaScript 性能優化的核心思路、常見場景和實戰案例,結合代碼…

服務器磁盤按陣列劃分為哪幾類

以下是服務器磁盤陣列(RAID)的詳細分類及技術解析,基于現行行業標準與實踐應用: 一、主流RAID級別分類 1. ?RAID 0(條帶化)? ?技術原理?:數據分塊后并行寫入多塊磁盤,無…

鴻蒙 Location Kit(位置服務)

移動終端設備已經深入人們日常生活的方方面面,如查看所在城市的天氣、新聞軼事、出行打車、旅行導航、運動記錄。這些習以為常的活動,都離不開定位用戶終端設備的位置。 Location Kit 使用多種定位技術提供服務,可以準確地確定設備在室外/室…

二叉樹深搜:在算法森林中尋找路徑

專欄:算法的魔法世界 個人主頁:手握風云 目錄 一、搜索算法 二、回溯算法 三、例題講解 3.1. 計算布爾二叉樹的值 3.2. 求根節點到葉節點數字之和 3.3. 二叉樹剪枝 3.4. 驗證二叉搜索樹 3.5. 二叉搜索樹中第 K 小的元素 3.6. 二叉樹的所有路徑 …

企業級AI搜索解決方案:阿里云AI搜索開放平臺

隨著信息技術的飛速發展,搜索引擎作為信息獲取的重要工具,扮演著不可或缺的角色。阿里云 AI 搜索開放平臺以其強大的技術支持和靈活的開放性,持續為用戶提供高效的搜索解決方案。 一、阿里云 AI 搜索開放平臺 一站式的 AI 搜索開放平臺作為…

自動駕駛中的預測控制算法:用 Python 讓無人車更智能

自動駕駛中的預測控制算法:用 Python 讓無人車更智能 自動駕駛技術近年來取得了令人驚嘆的進步,AI 與邊緣計算的結合讓車輛能夠實時感知環境、規劃路徑并執行駕駛決策。其中,預測控制(Model Predictive Control,MPC) 作為一種先進的控制算法,憑借其對未來駕駛行為的優化…

量子計算機超越超級計算機——它們解決了哪些問題?

“ 南加州大學的研究人員取得了重大突破,證明量子計算機在解決某些復雜問題時甚至可以勝過最快的超級計算機。” 量子退火最終顯示出擴展優勢,得益于錯誤抑制的量子處理,它比傳統超級計算機提供更快、接近最優的解決方案。 南加州大學的研究人…