日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Mysql 导入3亿数据

發(fā)布時(shí)間:2023/12/14 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql 导入3亿数据 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

前段時(shí)間,以前的同事問(wèn)我,Mysql能不能導(dǎo)入3億的數(shù)據(jù)。我腦子當(dāng)時(shí)翁的一下,不太確定的說(shuō)應(yīng)該可以導(dǎo)入的吧!只是導(dǎo)入進(jìn)去以后,可能會(huì)出現(xiàn)查詢過(guò)慢的情況。

于是馬上百度了一下,發(fā)現(xiàn)有人干過(guò)這種事情,在Mysql上面導(dǎo)入億級(jí)的數(shù)據(jù)(文章鏈接)。根據(jù)這篇文章的介紹,知道了原有的幾個(gè)坑。

第一個(gè)注意事項(xiàng):索引

第一個(gè)注意事項(xiàng)就是索引。建表的時(shí)候除了主鍵不要給別的字段建立索引。因?yàn)樗饕残枰獎(jiǎng)?chuàng)建,當(dāng)我們數(shù)據(jù)量過(guò)大的時(shí)候就要注意,這個(gè)時(shí)候創(chuàng)建索引會(huì)導(dǎo)致我們的數(shù)據(jù)導(dǎo)入時(shí)間無(wú)限拉長(zhǎng)。只需要留下一個(gè)自增ID做主鍵即可,如果你的數(shù)據(jù)本來(lái)就有主鍵(絕對(duì)唯一),就用這個(gè)主鍵,不用自增ID了。當(dāng)導(dǎo)入完成后,我們?cè)谔砑铀饕?/p>

第二個(gè)注意事項(xiàng):存儲(chǔ)引擎

Mysql一般默認(rèn)推薦使用InnoDB,但是這里由于我們沒(méi)有事務(wù)的需求,所以采用了查詢效率更高的MyISAM作為存儲(chǔ)引擎。需要注意的是MyISAM是沒(méi)有事務(wù)的,插入就插入了,沒(méi)有回滾的說(shuō)法。需要注意的是在進(jìn)行寫入操作的時(shí)候是鎖表的、所以在寫入的時(shí)候,不要同時(shí)去查詢表的數(shù)據(jù)。

第三個(gè)注意事項(xiàng):磁盤空間

在進(jìn)行插入之前一定要給自己的磁盤留下足夠的空間。需要注意的是導(dǎo)入存在較大事務(wù),超過(guò) binlog_cache_size,高并發(fā)下生成大量臨時(shí)文件(參考文章鏈接),如果我們不指定臨時(shí)文件目錄,那么如果你是windows系統(tǒng),你的臨時(shí)文件目錄很可能在C盤。可以使用show variables like "tmpdir";命令查看你自己的臨時(shí)目錄在哪里。如果空間不夠是會(huì)報(bào)錯(cuò)的:1598 - Binary logging not possible. Message: An error occurred during flush stage of the commit. 'binlog_error_action' is set to 'ABORT_SERVER'. Hence aborting the server.所以最好指定一下臨時(shí)文件的目錄tmpdir="D:/Program Files/db/mysql-8.0.20-winx64/tmp"

數(shù)據(jù)準(zhǔn)備

好了、開(kāi)始導(dǎo)入之旅。在導(dǎo)入之前我們需要準(zhǔn)備好對(duì)應(yīng)的數(shù)據(jù),這里先將表結(jié)構(gòu)貼出來(lái):

create table test_user_tab( id bigint comment '主鍵', now_date varchar(20) comment '插入時(shí)間', tel varchar(11) comment '電話', card_num varchar(18) comment '身份證號(hào)', sex int comment '性別:1男,0女', mz varchar(20) comment '名族', user_name varchar(20) comment '姓名', address_str varchar(50) comment '地址', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 comment '用戶測(cè)試表';

我們可以使用代碼來(lái)生成對(duì)應(yīng)的數(shù)據(jù),隨機(jī)生成電話、身份證號(hào)、性別、民族、姓名、地址。一次生成三個(gè)億的數(shù)據(jù)。

java生成數(shù)據(jù)

生成代碼倉(cāng)庫(kù):測(cè)試數(shù)據(jù)生成: 生成測(cè)試數(shù)據(jù)

import com.hzw.code.util.IDCardUtil; import com.hzw.code.util.RandomValue; import com.hzw.code.util.WeightRandomMz; import org.apache.commons.lang3.time.DateFormatUtils;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Date;public class Test {public static void main(String[] args) {int sex = 0;String card = null;int c = 1;for(int k=1;k<=3000; k++) {StringBuffer sbText = new StringBuffer();for (int i = 1; i <= 100000; i++) {card = IDCardUtil.generateID();if (Integer.parseInt(card.substring(16, 17)) % 2 == 1) {sex = 1;} else {sex = 0;}sbText.append(c++).append(",").append(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")).append(",").append(RandomValue.getTel()).append(",").append(card).append(",").append(sex).append(",").append(WeightRandomMz.getMz()).append(",").append(RandomValue.getChineseName()).append(",").append(RandomValue.getRoad()).append("\n");System.out.println("當(dāng)前條數(shù):"+c);}write("D:\\app\\ld\\users_data.txt", sbText.toString());}}/*** 追加寫入文件* @param file 文件路徑* @param text 追加寫入內(nèi)容*/public static void write(String file,String text) {FileOutputStream fos = null;FileChannel channel = null;try {fos = new FileOutputStream(file,true);channel = fos.getChannel();byte[] array = text.getBytes();ByteBuffer buffer = ByteBuffer.wrap(array);channel.write(buffer);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {channel.close();fos.close();} catch (IOException e) {e.printStackTrace();}}} }

導(dǎo)入數(shù)據(jù)

根據(jù)上面的java代碼,我們得到了3億數(shù)據(jù),單純的txt文件大小為:27.7GB。這個(gè)時(shí)候可以開(kāi)始導(dǎo)入了。表結(jié)構(gòu)在上面已經(jīng)貼出來(lái)了,按照上面的結(jié)構(gòu)進(jìn)行導(dǎo)入。

load data local infile 'D:/app/ld/users_data.txt' into table test_user_tab CHARACTER SET utf8 -- 可選,避免中文亂碼問(wèn)題 FIELDS TERMINATED BY ',' -- 字段分隔符,每個(gè)字段(列)以什么字符分隔,默認(rèn)是 \tOPTIONALLY ENCLOSED BY '' -- 文本限定符,每個(gè)字段被什么字符包圍,默認(rèn)是空字符ESCAPED BY '\\' -- 轉(zhuǎn)義符,默認(rèn)是 \ LINES TERMINATED BY '\n' -- 記錄分隔符,如字段本身也含\n,那么應(yīng)先去除,否則load data 會(huì)誤將其視作另一行記錄進(jìn)行導(dǎo)入 (id, now_date, tel, card_num, sex,mz,user_name,address_str) -- 每一行文本按順序?qū)?yīng)的表字段,建議不要省略

在執(zhí)行上面的代碼過(guò)后可能會(huì)報(bào)錯(cuò)Loading local data is disabled; this must be enabled on both the,需要開(kāi)啟全局本地文件設(shè)置

set global local_infile=on;

如此這版就需要開(kāi)始等待了

導(dǎo)入完畢后、表的大小:

????????索引長(zhǎng)度(4.03GB)、數(shù)據(jù)長(zhǎng)度(29.13GB)、最大數(shù)據(jù)長(zhǎng)度(256TB)

筆記本配置:

????????內(nèi)存:16G

????????CPU:AMD RYZEN 5 3500U 4核

????????固態(tài)硬盤:500G

SQL測(cè)試:Count全表之所以能辣么快、是因?yàn)镸yISAM引擎會(huì)存儲(chǔ)全表的數(shù)據(jù)條數(shù),Count全表的時(shí)候會(huì)直接從存儲(chǔ)好的count去拿。

mysql> select * from test_user_tab order by id desc limit 0,10; +-----------+---------------------+-------------+--------------------+-----+--------+-----------+----------------------+ | id | now_date | tel | card_num | sex | mz | user_name | address_str | +-----------+---------------------+-------------+--------------------+-----+--------+-----------+----------------------+ | 300000000 | 2021-06-30 10:28:34 | 13501545216 | 410101196604012797 | 1 | 獨(dú)龍 | 胡策棟 | 市場(chǎng)二大廈15號(hào)-15-8 | | 299999999 | 2021-06-30 10:28:34 | 13203729048 | 140101201101183795 | 1 | 布依 | 閭誠(chéng) | 閩江二廣場(chǎng)50號(hào)-1-6 | | 299999998 | 2021-06-30 10:28:34 | 13107976886 | 220101201409017312 | 1 | 布依 | 胥琰 | 漳平路65號(hào)-11-5 | | 299999997 | 2021-06-30 10:28:34 | 13405130128 | 530101198901051473 | 1 | 毛南 | 宮國(guó)翰 | 大港緯四街122號(hào)-5-10 | | 299999996 | 2021-06-30 10:28:34 | 13500788582 | 310101195005203737 | 1 | 漢 | 郭芳 | 澳門廣場(chǎng)118號(hào)-16-1 | | 299999995 | 2021-06-30 10:28:34 | 13500938547 | 540101200801079200 | 0 | 納西 | 公韻 | 濰縣廣場(chǎng)46號(hào)-6-7 | | 299999994 | 2021-06-30 10:28:34 | 15301675632 | 810101195409066773 | 1 | 塔塔爾 | 車倩 | 福山大廈13號(hào)-15-5 | | 299999993 | 2021-06-30 10:28:34 | 15502277286 | 120101200506094119 | 1 | 毛南 | 軒言光 | 小港二街111號(hào)-17-2 | | 299999992 | 2021-06-30 10:28:34 | 15307933706 | 620101199804149598 | 1 | 漢 | 蘇啟 | 吳淞路101號(hào)-20-4 | | 299999991 | 2021-06-30 10:28:34 | 13808373641 | 320101199212197480 | 0 | 藏 | 范姬華 | 武定路142號(hào)-9-5 | +-----------+---------------------+-------------+--------------------+-----+--------+-----------+----------------------+ 10 rows in set (0.19 sec) mysql> select * from test_user_tab where id in (569866,5656,23565,44,6,6467,8979); +--------+---------------------+-------------+--------------------+-----+------+-----------+---------------------+ | id | now_date | tel | card_num | sex | mz | user_name | address_str | +--------+---------------------+-------------+--------------------+-----+------+-----------+---------------------+ | 6 | 2021-06-30 09:14:24 | 13704555009 | 110101199102178730 | 1 | 回 | 許梁 | 新昌街148號(hào)-1-2 | | 44 | 2021-06-30 09:14:24 | 15101051329 | 430101200205272631 | 1 | 僳僳 | 儲(chǔ)慧佳 | 海陽(yáng)路76號(hào)-11-6 | | 5656 | 2021-06-30 09:14:24 | 15604920061 | 440101201702236208 | 0 | 漢 | 汝勇天 | 吳縣一街119號(hào)-5-3 | | 6467 | 2021-06-30 09:14:24 | 15505384583 | 520101196903158281 | 0 | 朝鮮 | 羊廣盛 | 新湛路133號(hào)-8-5 | | 8979 | 2021-06-30 09:14:24 | 13007372278 | 110101202107103898 | 1 | 滿 | 龔云 | 惠民南路65號(hào)-9-6 | | 23565 | 2021-06-30 09:14:24 | 13103003467 | 440101197306079977 | 1 | 傣 | 葛楓婷 | 澳門四街51號(hào)-17-9 | | 569866 | 2021-06-30 09:14:33 | 15603042860 | 32010119830925634X | 0 | 漢 | 容娟露 | 大港緯一路52號(hào)-14-9 | +--------+---------------------+-------------+--------------------+-----+------+-----------+---------------------+ 7 rows in set (0.21 sec)

只要使用id作為條件,因?yàn)橛兴饕年P(guān)系,挺快的。其他字段就沒(méi)有辣么快了。需要對(duì)要做where條件的字段添加索引才行。

總結(jié)

以上是生活随笔為你收集整理的Mysql 导入3亿数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。