MySQL快速插入一億測(cè)試數(shù)據(jù)
1、建表
1.1 建立測(cè)試表 t_user
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c_user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '用戶Id', `c_name` varchar(22) NOT NULL DEFAULT '' COMMENT '用戶名', `c_province_id` int(11) NOT NULL COMMENT '省份Id', `c_city_id` int(11) NOT NULL COMMENT '城市Id', `create_time` datetime NOT NULL COMMENT '創(chuàng)建時(shí)間', PRIMARY KEY (`id`), KEY `idx_user_id` (`c_user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.2 創(chuàng)建臨時(shí)表
CREATE TABLE `tmp_table` ( `id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、生成數(shù)據(jù)
2.1 用 python生成 【一億】 記錄的數(shù)據(jù)文件(這個(gè)確實(shí)稍微花點(diǎn)時(shí)間)
python -c "for i in range(1, 1+100000000): print(i)" > base.txt



2.2 將生成的文件導(dǎo)入到臨時(shí)表tmp_table中
找到對(duì)應(yīng)的數(shù)據(jù)庫(kù)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use test; Database changed mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | student | | t_user | | tmp_table | +----------------+ 3 rows in set (0.00 sec)
執(zhí)行導(dǎo)入命令
mysql> load data infile 'E:/base.txt' replace into table tmp_table; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement mysql>
導(dǎo)入數(shù)據(jù)時(shí)有可能會(huì)報(bào)錯(cuò),原因是mysql默認(rèn)沒(méi)有開(kāi)secure_file_priv( 這個(gè)參數(shù)用來(lái)限制數(shù)據(jù)導(dǎo)入和導(dǎo)出操作的效果,例如執(zhí)行LOAD DATA、SELECT … INTO OUTFILE語(yǔ)句和LOAD_FILE()函數(shù)。這些操作需要用戶具有FILE權(quán)限。 )
解決辦法:在mysql的配置文件中(my.ini 或者 my.conf)中添加 secure_file_priv = 文件所在的路徑 , 然后重啟mysql 解決。添加自己文件放置的路徑即可。
可以用 show variables like '%secure%'; 先看一下配置:
mysql> show variables like '%secure%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | require_secure_transport | OFF | | secure_auth | ON | | secure_file_priv | NULL | +--------------------------+-------+ 3 rows in set, 1 warning (0.00 sec)
說(shuō)明:
secure_file_prive=null 限制mysqld 不允許導(dǎo)入導(dǎo)出 secure_file_priv=/var/lib/mysql-files/ 限制mysqld的導(dǎo)入導(dǎo)出只能發(fā)生在/var/lib/mysql-files/目錄下 secure_file_priv=' ' 不對(duì)mysqld的導(dǎo)入導(dǎo)出做限制
注意:配置要添加到 [mysqld] 節(jié)點(diǎn)下,至于路徑加不加引號(hào),你可以試試:

重啟MySQL,先查看配置:
mysql> use test; Database changed mysql> show variables like '%secure%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | require_secure_transport | OFF | | secure_auth | ON | | secure_file_priv | E:\ | +--------------------------+-------+ 3 rows in set, 1 warning (0.00 sec)
再重新導(dǎo)入:
mysql> load data infile 'E:/base.txt' replace into table tmp_table; Query OK, 100000000 rows affected (3 min 53.42 sec) Records: 100000000 Deleted: 0 Skipped: 0 Warnings: 0 mysql>
億級(jí)數(shù)據(jù),233.42s,看一下別人的數(shù)據(jù),差不多就是這個(gè)。

3、以臨時(shí)表為基礎(chǔ)數(shù)據(jù),插入數(shù)據(jù)到t_user中
一億數(shù)據(jù)需要:快半個(gè)小時(shí)了。。。(或許直接在命令行下運(yùn)行更快點(diǎn)...)

更新創(chuàng)建時(shí)間字段讓插入的數(shù)據(jù)的創(chuàng)建時(shí)間更加隨機(jī):
mysql> UPDATE t_user SET create_time=date_add(create_time, interval FLOOR(1 + (RAND() * 7)) year); Query OK, 100000000 rows affected (7 min 24.17 sec) Rows matched: 100000000 Changed: 100000000 Warnings: 0 mysql> UPDATE t_user SET create_time=date_add(create_time, interval FLOOR(1 + (RAND() * 7)) year); Query OK, 100000000 rows affected (8 min 2.49 sec) Rows matched: 100000000 Changed: 100000000 Warnings: 0
到此,一億數(shù)據(jù)插入結(jié)束。
4、參考
MySQL如何快速的創(chuàng)建千萬(wàn)級(jí)測(cè)試數(shù)據(jù)
The MySQL server is running with the --secure-file-priv option
到此這篇關(guān)于MySQL快速插入一億測(cè)試數(shù)據(jù)的文章就介紹到這了,更多相關(guān)MySQL 插入一億數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DBeaver連接mysql數(shù)據(jù)庫(kù)圖文教程(超詳細(xì))
本文主要介紹了DBeaver連接mysql數(shù)據(jù)庫(kù)圖文教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
pymysql.err.DataError:(1264, ")異常的有效解決方法(最新推薦)
遇到pymysql.err.DataError錯(cuò)誤時(shí),錯(cuò)誤代碼1264通常指的是MySQL數(shù)據(jù)庫(kù)中的Out of range value for column錯(cuò)誤,這意味著你嘗試插入或更新的數(shù)據(jù)超過(guò)了對(duì)應(yīng)數(shù)據(jù)庫(kù)列所允許的范圍,這篇文章主要介紹了pymysql.err.DataError:(1264, ")異常的有效問(wèn)題,需要的朋友可以參考下2024-05-05
MySQL中的用戶創(chuàng)建與權(quán)限管理
這篇文章主要介紹了MySQL中的用戶創(chuàng)建與權(quán)限管理,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
MySQL 隨機(jī)查詢數(shù)據(jù)與隨機(jī)更新數(shù)據(jù)實(shí)現(xiàn)代碼
以下的文章主要講述的是MySQL隨機(jī)查詢數(shù)據(jù)、MySQL隨機(jī)更新數(shù)據(jù)的實(shí)際應(yīng)用以及對(duì)MySQL隨機(jī)查詢數(shù)據(jù)、MySQL隨機(jī)更新數(shù)據(jù)的實(shí)際應(yīng)用代碼的描述,以下就是文章的主要內(nèi)容描述,望你會(huì)有所收獲。2010-06-06
replace MYSQL字符替換函數(shù)sql語(yǔ)句分享(正則判斷)
最近更新網(wǎng)站發(fā)現(xiàn)一些字段的值不是預(yù)期的效果,需要替換下值,通過(guò)下面的sql語(yǔ)句,直接執(zhí)行就可以了2012-06-06
MySQL使用binlog日志做數(shù)據(jù)恢復(fù)的實(shí)現(xiàn)
這篇文章主要介紹了MySQL使用binlog日志做數(shù)據(jù)恢復(fù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
SQL筆記之?dāng)?shù)據(jù)庫(kù)結(jié)構(gòu)優(yōu)化方式
這篇文章主要介紹了SQL筆記之?dāng)?shù)據(jù)庫(kù)結(jié)構(gòu)優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
MySQL 百萬(wàn)級(jí)數(shù)據(jù)的4種查詢優(yōu)化方式
本文講解了MySQL 百萬(wàn)級(jí)數(shù)據(jù)的4種查詢優(yōu)化方式,大家可以根據(jù)自身需求,選擇適合自己的優(yōu)化方式2021-06-06
mysql優(yōu)化系列 DELETE子查詢改寫(xiě)優(yōu)化
有個(gè)采用子查詢的DELETE執(zhí)行得非常慢,改寫(xiě)成SELECT后執(zhí)行卻很快,最后把這個(gè)子查詢DELETE改寫(xiě)成JOIN優(yōu)化過(guò)程2016-08-08
MySQL優(yōu)化之表結(jié)構(gòu)優(yōu)化的5大建議(數(shù)據(jù)類型選擇講的很好)
很多人都將 數(shù)據(jù)庫(kù)設(shè)計(jì)范式 作為數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)“圣經(jīng)”,認(rèn)為只要按照這個(gè)范式需求設(shè)計(jì),就能讓設(shè)計(jì)出來(lái)的表結(jié)構(gòu)足夠優(yōu)化,既能保證性能優(yōu)異同時(shí)還能滿足擴(kuò)展性要求2014-03-03

