欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL實(shí)現(xiàn)大數(shù)據(jù)量快速插入的性能優(yōu)化

 更新時(shí)間:2025年05月23日 09:54:54   作者:悟能不能悟  
這篇文章主要為大家詳細(xì)介紹了MySQL如何實(shí)現(xiàn)大數(shù)據(jù)量快速插入并進(jìn)行一定的性能優(yōu)化,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、SQL語句優(yōu)化?

1. ?批量插入代替單條插入?

?單條插入會(huì)頻繁觸發(fā)事務(wù)提交和日志寫入,效率極低。

?批量插入通過合并多條數(shù)據(jù)為一條SQL語句,減少網(wǎng)絡(luò)傳輸和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'), ...;

?建議單次插入數(shù)據(jù)量?:控制在 500~2000 行(避免超出 max_allowed_packet)。

2. ?禁用自動(dòng)提交(Autocommit)??

默認(rèn)情況下,每條插入都會(huì)自動(dòng)提交事務(wù),導(dǎo)致頻繁的磁盤I/O。

?手動(dòng)控制事務(wù),將多個(gè)插入操作合并為一個(gè)事務(wù)提交:

START TRANSACTION;
INSERT INTO table ...;
INSERT INTO table ...;
...
COMMIT;

?注意?:事務(wù)過大可能導(dǎo)致 undo log 膨脹,需根據(jù)內(nèi)存調(diào)整事務(wù)批次(如每 1萬~10萬 行提交一次)。

3. ?**使用 LOAD DATA INFILE**?

從文件直接導(dǎo)入數(shù)據(jù),比 INSERT 快 ?20倍以上,跳過了SQL解析和事務(wù)開銷。

LOAD DATA LOCAL INFILE '/path/data.csv' 
INTO TABLE table
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';

?適用場景?:從CSV或文本文件導(dǎo)入數(shù)據(jù)。

4. ?禁用索引和約束?

插入前禁用索引(尤其是唯一索引和全文索引),插入完成后重建:

-- 禁用索引
ALTER TABLE table DISABLE KEYS;
-- 插入數(shù)據(jù)...
-- 重建索引
ALTER TABLE table ENABLE KEYS;

?禁用外鍵檢查?:

SET FOREIGN_KEY_CHECKS = 0;
-- 插入數(shù)據(jù)...
SET FOREIGN_KEY_CHECKS = 1;

?二、參數(shù)配置優(yōu)化?

1. ?InnoDB引擎參數(shù)調(diào)整?

?**innodb_flush_log_at_trx_commit**?:

  • 默認(rèn)值為 1(每次事務(wù)提交都刷盤),改為 0 或 2 可減少磁盤I/O。
  • 0:每秒刷盤(可能丟失1秒數(shù)據(jù))。
  • 2:提交時(shí)寫入OS緩存,不強(qiáng)制刷盤。

?**innodb_buffer_pool_size**?:增大緩沖池大?。ㄍǔTO(shè)為物理內(nèi)存的 70%~80%),提高數(shù)據(jù)緩存命中率。

?**innodb_autoinc_lock_mode**?:設(shè)為 2(交叉模式),減少自增鎖競爭(需MySQL 8.0+)。

2. ?調(diào)整網(wǎng)絡(luò)和包大小?

?**max_allowed_packet**?:增大允許的數(shù)據(jù)包大?。J(rèn) 4MB),避免批量插入被截?cái)唷?/p>

?**bulk_insert_buffer_size**?:增大批量插入緩沖區(qū)大?。J(rèn) 8MB)。

3. ?其他參數(shù)?

?**back_log**?:增大連接隊(duì)列長度,應(yīng)對(duì)高并發(fā)插入。

?**innodb_doublewrite**?:關(guān)閉雙寫機(jī)制(犧牲數(shù)據(jù)安全換取性能)。

?三、存儲(chǔ)引擎選擇?

1. ?MyISAM引擎?

?優(yōu)點(diǎn)?:插入速度比InnoDB快(無事務(wù)和行級(jí)鎖開銷)。

?缺點(diǎn)?:不支持事務(wù)和崩潰恢復(fù),適合只讀或允許數(shù)據(jù)丟失的場景。

2. ?InnoDB引擎?

?優(yōu)點(diǎn)?:支持事務(wù)和行級(jí)鎖,適合高并發(fā)寫入。?

優(yōu)化技巧?:

  • 使用 innodb_file_per_table 避免表空間碎片。
  • 主鍵使用自增整數(shù)(避免隨機(jī)寫入導(dǎo)致的頁分 裂)。

?四、硬件和架構(gòu)優(yōu)化?

1. ?使用SSD硬盤?

替換機(jī)械硬盤為SSD,提升I/O吞吐量。

2. ?分庫分表?

  • 將單表拆分為多個(gè)子表(如按時(shí)間或ID范圍),減少單表壓力。
  • 使用中間件(如ShardingSphere)或分區(qū)表(PARTITION BY)。

3. ?讀寫分離?

主庫負(fù)責(zé)寫入,從庫負(fù)責(zé)查詢,降低主庫壓力。

4. ?異步寫入?

將數(shù)據(jù)先寫入消息隊(duì)列(如Kafka),再由消費(fèi)者批量插入數(shù)據(jù)庫。

?五、代碼層面優(yōu)化?

1. ?多線程并行插入?

將數(shù)據(jù)分片,通過多線程并發(fā)插入不同分片。

?注意?:需確保線程間無主鍵沖突。

2. ?預(yù)處理語句(Prepared Statements)??

復(fù)用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();

?六、性能對(duì)比示例

優(yōu)化方法插入10萬條耗時(shí)(秒)
逐條插入(默認(rèn))120
批量插入(1000行/次)5
LOAD DATA INFILE1.5

?總結(jié)?

?核心思路?:減少磁盤I/O、降低鎖競爭、合并操作。

?推薦步驟?:

  • 優(yōu)先使用 LOAD DATA INFILE 或批量插入。
  • 調(diào)整事務(wù)提交策略和InnoDB參數(shù)。
  • 優(yōu)化表結(jié)構(gòu)(禁用非必要索引)。
  • 根據(jù)硬件和場景選擇存儲(chǔ)引擎。
  • 在架構(gòu)層面分庫分表或異步寫入。

通過上述方法,可在MySQL中實(shí)現(xiàn)每秒數(shù)萬甚至數(shù)十萬條的高效插入。

到此這篇關(guān)于MySQL實(shí)現(xiàn)大數(shù)據(jù)量快速插入的性能優(yōu)化的文章就介紹到這了,更多相關(guān)MySQL大數(shù)據(jù)量插入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySql中的存儲(chǔ)引擎和索引

    MySql中的存儲(chǔ)引擎和索引

    這篇文章主要介紹了MySql中的存儲(chǔ)引擎和索引,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Mysql字符集和排序規(guī)則詳解

    Mysql字符集和排序規(guī)則詳解

    這篇文章主要介紹了Mysql字符集和排序規(guī)則詳解,在mysql中存儲(chǔ)的是字符串?dāng)?shù)據(jù),那么這些數(shù)據(jù)到底在Mysql中如何存儲(chǔ)呢?這就涉及到字符集的概念,接下來我們一起進(jìn)入文章學(xué)習(xí)詳細(xì)內(nèi)容介紹吧
    2022-09-09
  • Mysql中返回一個(gè)數(shù)據(jù)庫的所有表名,列名數(shù)據(jù)類型備注

    Mysql中返回一個(gè)數(shù)據(jù)庫的所有表名,列名數(shù)據(jù)類型備注

    在Mysql中怎樣返回一個(gè)數(shù)據(jù)庫的所有表名,列名數(shù)據(jù)類型備注
    2010-04-04
  • Linux下mysql 8.0安裝教程

    Linux下mysql 8.0安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux下mysql 8.0安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南

    SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南

    這篇文章主要為大家介紹了SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Linux?安裝?MySQL?8.0?及?配置方法

    Linux?安裝?MySQL?8.0?及?配置方法

    本文詳細(xì)介紹了在Ubuntu操作系統(tǒng)上使用MySQL?APT存儲(chǔ)庫安裝和配置MySQL?8.0的步驟,本文通過圖文示例相結(jié)合給大家講解的非常詳細(xì),感興趣的朋友一起看看吧
    2024-11-11
  • MySQL新增字段后Java實(shí)體未更新的潛在問題與解決方案

    MySQL新增字段后Java實(shí)體未更新的潛在問題與解決方案

    在Java+MySQL的開發(fā)中,我們通常使用ORM框架來映射數(shù)據(jù)庫表與 Java 對(duì)象,但有時(shí)候,數(shù)據(jù)庫表結(jié)構(gòu)變更(如新增字段)后,開發(fā)人員可能忘記同步更新Java實(shí)體類,會(huì)導(dǎo)致什么問題?接下小編給大家介紹了MySQL新增字段后Java實(shí)體未更新的潛在問題與解決方案
    2025-03-03
  • MySQL服務(wù)啟動(dòng)與關(guān)閉如何操作圖文詳解

    MySQL服務(wù)啟動(dòng)與關(guān)閉如何操作圖文詳解

    這篇文章主要為大家介紹了MySQL服務(wù)啟動(dòng)與關(guān)閉如何操作圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-10-10
  • mysql利用覆蓋索引避免回表優(yōu)化查詢

    mysql利用覆蓋索引避免回表優(yōu)化查詢

    這篇文章主要給大家介紹了關(guān)于mysql如何利用覆蓋索引避免回表優(yōu)化查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫原理解析

    MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫原理解析

    這篇文章主要介紹了MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論