1. 程式人生 > >mysql中關於批量插入資料(1萬、10萬、100萬、1000萬、1億級別的資料)二

mysql中關於批量插入資料(1萬、10萬、100萬、1000萬、1億級別的資料)二

硬體:windows7+8G記憶體+i3-4170處理器+4核CPU

關於前天寫的批量插入資料,還有一種方式,就是通過預先寫入文字檔案,然後通過mysql的load in file命令匯入到資料庫,今天把這種方式也說一下,首先是main方法呼叫:

解釋一下為什麼要兩個引數:

第一個引數是寫入幾次

第二個引數是一次寫入多少條,直觀來說就是StringBuffer中儲存多少條記錄(目的為了測試StringBuffer達到多少會記憶體溢位)

第三個是檔案的儲存位置(檔案以W為單位)

注:其實按照正常思維,第一個和第二個引數應該換一下位置,應該是先一次多少條,然後在說明幾次的,但當時寫的時候直接給寫上去了,所以就懶得改了,見諒大家~

public static void main(String[] args) throws Exception {
    	createDate(100, 100000, "D:/10000.txt");
		createDateByBufferedWriter(1000, 100000, "F:/10000.txt");
	}

第一種:

通過PrintStream流進行輸出:

     * 生成1萬條資料共花費193毫秒 
     * 生成10萬條資料共花費552毫秒 
     * 生成100萬條資料共花費2667毫秒 
     * 生成1000萬條資料共花費19539毫秒
     * 生成1億條資料共花費180303毫秒

private static void createDate(int amount, int time, String filePath) throws Exception {
		File file = new File(filePath);
		PrintStream ps = new PrintStream(file);

		long start = System.currentTimeMillis();
		long row = 1;
		StringBuffer bf = new StringBuffer();
		for (int j = 0; j < amount; j++) {
			for (int i = 0; i < time; i++) {
				String uuid = UUID.randomUUID().toString();
				String name = uuid.substring(0, 4);
				int sex = -1;
				if (Math.random() < 0.51) {
					sex = 1;
				} else {
					sex = 0;
				}
				String phone = (String) RandomValue.getAddress().get("tel");
				bf.append(row + "\t" + name + "\t" + sex + "\t" + phone + "\t" + uuid + "\n");
				row++;
			}
			ps.println(bf.toString());
			bf.setLength(0);
		}
		ps.close();
		long end = System.currentTimeMillis();
		System.out.println("生成10000萬條資料共花費" + (end - start) + "毫秒");

	}

第二種:

通過BufferedWriter流進行輸出:

     * 生成1萬條資料共花費155毫秒 
     * 生成10萬條資料共花費599毫秒 
     * 生成100萬條資料共花費2364毫秒 
     * 生成1000萬條資料共花費18197毫秒
     * 生成1億條資料共花費174275毫秒

private static void createDateByBufferedWriter(int amount, int time, String filePath) throws Exception {
		File file = new File(filePath);
		BufferedWriter bw = new BufferedWriter(new FileWriter(file));

		long start = System.currentTimeMillis();
		long row = 1;
		StringBuffer bf = new StringBuffer();
		for (int j = 0; j < amount; j++) {
			for (int i = 0; i < time; i++) {
				String uuid = UUID.randomUUID().toString();
				String name = uuid.substring(0, 4);
				int sex = -1;
				if (Math.random() < 0.51) {
					sex = 1;
				} else {
					sex = 0;
				}
				String phone = (String) RandomValue.getAddress().get("tel");
				bf.append(row + "\t" + name + "\t" + sex + "\t" + phone + "\t" + uuid + "\n");
				row++;
			}
			bw.write(bf.substring(0, bf.length()-1));
			bf.setLength(0);
		}
		bw.close();
		long end = System.currentTimeMillis();
		System.out.println("生成10000萬條資料共花費" + (end - start) + "毫秒");
	}

總結:

為了資料的快速生成,我這裡利用了StringBuffer作為緩衝區,並且通過例項驗證得出StringBuffer在10W條的時候執行沒有問題,但100W條會發生記憶體溢位,具體界限在哪沒有深究。

關於檔案匯入到資料庫就不說了,感興趣的可以自己動手測試測試,按照上面這兩種方式,生成資料會非常快,但是檔案大了之後利用load in file匯入到資料庫中就會變慢很多,因此這兩種方式和前天寫的批量新增的方式各有優劣吧,具體情況可以根據具體的業務需求來制定選用哪種方式。

在上一次的部落格裡,有位同志評論說上億條資料可以考慮換方案,但就目前我的水平來說,沒有想到用什麼技術來實現這種資料遷移,希望有大佬知道的話可以評論區分享分享~