MySQL提高插入數據的效率(結合JDBC)

0 解決問題最佳途徑:直接找官方

先說明的是,有問題直接去找官方文檔,而不應該去百度搜索,您很容易體驗到,搜索引擎很難快速找到真正對您有價值的解決方案,而官方文檔是最快捷的途徑。

本篇也是基于官方文檔和自己的實踐得出的一些經驗,適合初學者,本人也是初學者。

測試的插入數據只有353條,但是您依然能夠體會到性能的提升。

1 【40s】使用云數據庫Mysql的體驗

下面是使用JDBC和INSERT INTO語句逐條插入信息。

/*** 將訂單信息存入表 Performance_First** @param SalesOrder 銷售提交批量訂單* @param id         當前登錄賬戶的id*/
private static void InsertSalesOrder(int id, String name, int[] SalesOrder) throws SQLException {Connection connection = null;PreparedStatement insertSalesOrder = null;String insertSalesOrderSQL = "insert into Performance_First " +"values (?,?,0,now(),?,0)";long startTime = 0;try {connection = DatabaseOperation.CreateDatabaseConnection();assert connection != null;insertSalesOrder = connection.prepareStatement(insertSalesOrderSQL);startTime = System.currentTimeMillis();// TODO 記錄時間// 插入訂單for (int TemporarySalesOrder : SalesOrder) {insertSalesOrder.setInt(1, id);insertSalesOrder.setString(2, name);insertSalesOrder.setInt(3, TemporarySalesOrder);insertSalesOrder.execute();// 應該加點插入成功的標記}} catch (Exception e) {e.printStackTrace();} finally {DatabaseOperation.CloseDatabase(connection, insertSalesOrder);}long endTime = System.currentTimeMillis();System.out.println("程序運行時間:" + (endTime - startTime) + "ms");
}

測試數據是353條,居然需要40s,我的天,難以忍受!

于是使用bing搜索半天,也沒有找到什么結果,之后看見了官方文檔,很快找到完美的解決方案

首先,進入Mysql中文文檔,找到第7章 優化(可惜沒有搜索功能……)。

我們找到INSERT語句的速度。

入一個記錄需要的時間由下列因素組成,其中的數字表示大約比例:
連接:(3)
發送查詢給服務器:(2)
分析查詢:(2)
插入記錄:(1x記錄大小)
插入索引:(1x索引)
關閉:(1)
這不考慮打開表的初始開銷,每個并發運行的查詢打開。

好了,現在明白了,使用云數據庫,連接和發送就占用了大部分時間,所以,使用本地數據庫試一試?

2 【2s】提高性能:使用本地數據庫

這部分依然使用INSERT INTO語句,速度果然提高了很多,比較不需要聯網發送數據了。

不過,我們還想再快一點,此時,你需要知道,你不知道你不知道的知識,如果官方文檔找不到蛛絲馬跡,又沒有搜索,那就只能先去搜索引擎搜一下,看看我們需要解決那個位置的問題。

不過,幸運的是,官方文檔還真有。

當從一個文本文件裝載一個表時,使用LOAD DATA INFILE。這通常比使用很多INSERT語句快20倍。參見LOAD DATA INFILE語法。

3 【20ms】進一步提高性能:使用LOAD DATA INFILE而不是INSERT INTO

我們獲取了LOAD DATA INFILE的語法原型,然后使用我們需要的部分就可以了。

3.1 使用什么選項

我們的需求是

  1. 將txt文件導入到數據庫表的一部分columns
  2. 將其他的columns設置為指定值

根據語法原型,我們需要的語法格式是

LOAD DATA INFILE [file_name]
INTO TABLE [table_name](column1,column2,……)
SET column5=expr,column6=expr……

JDBC是這樣的(關鍵代碼)

String sql = "LOAD DATA INFILE ? " +"INTO TABLE Performance_First(SalesOrder) " +"SET ID=?,Name=?,QueryStatus=0,SubmitTime=now(),CalculateStatus=0";
try (Connection connection = DatabaseOperation.CreateDatabaseConnection(); // 連接數據庫
) {assert connection != null;startTime = System.currentTimeMillis();try (PreparedStatement p = connection.prepareStatement(sql);) {p.setString(1, filePath);p.setInt(2, id);p.setString(3, name);p.execute();}
}

3.2 文件路徑:客戶端與服務器

如果指定了LOCAL,則被認為與連接的客戶端有關:
· 如果指定了LOCAL,則文件會被客戶主機上的客戶端讀取,并被發送到服務器。文件會被給予一個完整的路徑名稱,以指定確切的位置。如果給定的是一個相對的路徑名稱,則此名稱會被理解為相對于啟動客戶端時所在的目錄。

  • 如果LOCAL沒有被指定,則文件必須位于服務器主機上,并且被服務器直接讀取。
    當在服務器主機上為文件定位時,服務器使用以下規則:
  • 如果給定了一個絕對的路徑名稱,則服務器使用此路徑名稱。
  • 如果給定了帶有一個或多個引導組件的相對路徑名稱,則服務器會搜索相對于服務器數據目錄的文件。
  • 如果給定了一個不帶引導組件的文件名稱,則服務器會在默認數據庫的數據庫目錄中尋找文件。
    注意,這些規則意味著名為./myfile.txt的文件會從服務器數據目錄中被讀取,而名為myfile.txt的同樣的文件會從默認數據庫的數據庫目錄中讀取。例如,下面的LOAD DATA語句會從db1數據庫目錄中讀取文件data.txt,因為db1是當前數據庫。即使語句明確把文件載入到db2數據庫中的表里,也會從db1目錄中讀取。
mysql> USE db1;
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

注意,使用正斜杠指定Windows路徑名稱,而不是使用反斜杠。如果您使用反斜杠,您必須使用兩個。
出于安全原因,當讀取位于服務器中的文本文件時,文件必須位于數據庫目錄中,或者是全體可讀的。另外,要對服務器文件使用LOAD DATA INFILE,您必須擁有FILE權限。

我們選擇直接使用服務器本地的文件,而不是客戶端遠程上傳,因此不需要加LOCAL

此外,數據庫的文件會有默認的DATA文件夾,如果使用./則會認為是此文件夾,使用JDBC導入文件夾的時候,需要

  1. 獲取java工程的路徑
  2. 文件路徑 = Java工程路徑 + 文件名

注意加上后綴,并且,不要使用中文

3.3 注意

  1. 不能包含中文:文件的路徑和文件名都不能包含中文
  2. 您可能會遇到一些報錯,這是因為權限不足,默認情況下,只有指定文件夾中的文件可以被導入,這個問題請如果您遇到,請自行查閱資料解決。

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

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

相關文章

【計算機心理學】先設計再實現 在實現中完善設計

先設計再實現 在物理學中,通常都是先理論證明觀點,再進行實踐,然后,再有世界各地的科學家根據理論進行實驗,以證明觀點正確。 在計算機軟件開發,硬件開發等,都講求先邏輯抽象設計,…

【FPGA VerilogHDL】第一次嘗試:LED燈基礎實驗

0 實驗環境 0.1 軟件環境 ISE 14.7win10vivado 2017.4 0.2 硬件設備 ISE適用的FPGA開發板:ALINK AX309 1 需求 能夠靈活控制4個LED燈 2 Verilog實現 timescale 1ns / 1ps // // Create Date: 14:18:20 08/08/2020 // Module Name: led // Revision…

使用ISE一鍵生成bit文件

我們知道,這幾個,在第一次做好源文件之后,需要一個個進行右鍵單擊-->run,以發現錯誤。 但是之后的調試,只要一點點變化,哪怕是注釋變化,都需要重新run3次,太麻煩了。 不過經過實…

【FPGA Verilog】實驗二:key按鍵基礎實驗

只說一下經驗和教訓 1 必須按照設計流程走 不要因為實驗簡單,就直接進行綜合,比如按照 設計編碼RTL優化仿真綜合管腳分配,實現下載 一定要按照這個步驟來。 2 必須先查看開發板說明文檔 開始出了一個令人困惑的問題,后來發現…

【Java】字符串轉換為數字:Integer的parseInt方法

Java官方文檔[1]的解釋 public static int parseInt?(String s) throws NumberFormatException Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus…

在win10上使用Vmware安裝Mac OS

安裝macOS 如何在Windows上VMware上安裝macOS Catalina 10.15 做一些提示: 如果您在第一次啟動mac的時候,在出現【語言選擇】之前,出現了連接藍牙內容。 您可以將教程中【修改為win10 x64】那一步跳過,請注意,如果您…

JDBC 防御性編程

防御性編程(Defensive Programming) 什么是Defensive Programming[1]? 原文:Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circu…

【Java】異常處理的目的

編程思維:Defensive Programming 我們寫好程序,將其打包,然后用戶就可以使用和運行,但是,外界的情況是未知的,我們的程序很可能因為某個因素的出現而崩潰,因此,對于我們可以預測到的…

【Coursera】Getting Started with Python:Week One - Reading: Welcome to The Class

原文 & 翻譯 Reading: Welcome to The Class Welcome to Getting Started with Python, the first class in our Python for Everybody Specialization. We have built this class specifically for those with no prior programming experience. With a relatively simpl…

【Java】獲取目錄及其子目錄文件的相關事宜

獲取目錄及其子目錄文件的代碼 public class Main {public static void main(String[] args) {String path "D:/"; File f new File(path);Main.getFile(f);}public static void getFile(File file){if(file ! null){File[] f file.listFiles();if(f ! null){for…

【計算機思維】面向人的開發 站在巨人的肩膀上

思維轉變:使用其他程序員開發的“黑箱”,不要重復造輪子 以Java舉例,從常用的集合框架開始,我們要產生新的思維轉變了,我們已經學會了基本的功能,但是在真正開發的時候,用基礎功能去做開發效率…

【Computer Organization】The Core Design Thinking of single cycle CPU

1 Overview This section introduces someting that maybe you need to know before learning. Note:This CPU is based on MIPS instruction set. 1.1 Tools LogisimCS 3410 ComponentsMARS MIPS simulatorWin10 or Mac OS 1.2 Courses 自己動手畫CPU《計算機組織與結構實…

【匯編語言】王爽 - 內中斷復習

0 前言 基于王爽《匯編語言》和Coursera的《計算機組成》課程。 1 中斷分類 CPU在執行指令的過程中,產生了一個異常/中斷,因為CPU只能同時執行一條指令,所以需要暫停該指令的執行,轉而去處理異常/中斷信息。 這個異常可以來…

【算法】蠻力法/窮舉法/枚舉法 的基本問題分析

炮兵問題的優化,設立邏輯數組 蠻力法設計思想 有策略地窮舉 驗證 制定窮舉策略避免重復 簡單來說,就是列舉問題所有可能的解,然后去看看是否滿足題目要求,是一種逆向解題方式。(我也不知道答案是什么,…

如何高效學習算法【實例 + 可視化】

對于初學者來說,學習算法,不應該先學習抽象的理論,那樣沒有感覺,越學越暈,應該: 有具體的例子有可視化過程 同時需要結合理論知識對照學習,理論扎實、實踐有效,同時要有結果反饋。…

【計算機網絡實驗·北航】實驗一:網絡實驗入門(1)

1.3 遠程在線環境使用 PCA、PCB、PCC和PCD:4臺PC機S1、S2:2臺交換機R1、R2:2臺路由器中間的設備:組網連線器 遠程組網連線: 使用PCA上的組網連線軟件,配置組網連線器,實現組網連線。 PCA和PCB…

【C++】int與string轉換

頭文件&#xff1a;<string>&#xff0c;注意&#xff0c;這與<string.h>、<cstring>不是一回事兒語法&#xff1a;int x to_string(str)&#xff0c;其中string str "1"。

【C++】rand函數的基本使用

rand()函數用于生成偽隨機數&#xff0c;每次生成的隨機數都不變&#xff0c;方便我們調試程序。 重要是的隨機數的范圍公式&#xff08;適用整數&#xff09; 公式&#xff1a; 確定范圍加偏移量 例如&#xff1a;a和b是整數 [a,b]&#xff0c;范圍是b - a 1&#xff0c…

【操作系統】虛擬化CPU、Memory,共享文件

幾個概念 CPU、虛擬CPU進程內存、虛擬地址空間 物理的CPU被OS虛擬成了多個虛擬的CPU&#xff0c;這些虛擬CPU分別運行各自的程序&#xff0c;這些正在運行的程序被稱為進程。物理內存被OS虛擬成了多個虛擬地址空間&#xff0c;每個進程都有獨立的、自己的地址空間&#xff0c;…

【Linux】編譯C語言文件(-o -lpthread)

在gcc中使用-o編譯 對于一個一般的程序&#xff0c;直接使用gcc <C語言文件名> -o <編譯后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…