MySQL制作具有千萬(wàn)條測(cè)試數(shù)據(jù)的測(cè)試庫(kù)的方法
有時(shí)候需要制造一些測(cè)試的數(shù)據(jù),以mysql官方給的測(cè)試庫(kù)為基礎(chǔ),插入十萬(wàn),百萬(wàn)或者千萬(wàn)條數(shù)據(jù)。利用一些函數(shù)和存儲(chǔ)過(guò)程來(lái)完成。
官方給的測(cè)試庫(kù)地址:https://github.com/datacharmer/test_db
導(dǎo)入官方的數(shù)據(jù)庫(kù),做了一些簡(jiǎn)化,留下了部門表,員工表和雇傭表三張表,去掉了外鍵關(guān)聯(lián)。因?yàn)槭菧y(cè)試數(shù)據(jù),日期的對(duì)應(yīng)關(guān)系不具備準(zhǔn)確性。
必要的函數(shù)
生成隨機(jī)字符串
RAND():生成0~1之間的隨機(jī)數(shù)
FLOOR:向下整數(shù) (FlOOR(1.2)=1)
CEILING 向上取整 (CEILING(1.2)=2)
substring:截取字符串
concat:字符串連接
CREATE DEFINER=`root`@`localhost` FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1 BEGIN DECLARE chars_str varchar(100) DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; DECLARE return_str varchar(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); SET i = i +1; END WHILE; RETURN return_str; END
查看自定義的所有函數(shù)
show function status
測(cè)試使用:
select rand_string(5);
生成隨機(jī)年月日字符串
生成一個(gè)指定時(shí)間段內(nèi)的隨機(jī)日期
SELECT date( from_unixtime( unix_timestamp( '2000-01-01' ) + floor( rand() * ( unix_timestamp( '2020-12-31' ) - unix_timestamp( '2000-01-01' ) + 1 ) ) ));
函數(shù):生成指定時(shí)間段內(nèi)的隨機(jī)日期
CREATE DEFINER=`root`@`localhost` FUNCTION `rand_date_string`(startDate varchar(255),endDate varchar(255)) RETURNS varchar(255) CHARSET latin1 BEGIN DECLARE return_str varchar(255) DEFAULT ''; SET return_str =date( from_unixtime( unix_timestamp( startDate ) + floor( rand() * ( unix_timestamp( endDate ) - unix_timestamp( startDate ) + 1 ) ) ) ); RETURN return_str; END
測(cè)試使用:
select rand_date_string('2000-01-01','2020-12-31'); //結(jié)果 2001-09-10
存儲(chǔ)過(guò)程生成數(shù)據(jù)
給每個(gè)部門插入一百萬(wàn)員工,那么員工表就有九百萬(wàn)的數(shù)據(jù)。
CREATE DEFINER=`root`@`localhost` PROCEDURE `data`() BEGIN DECLARE i INT DEFAULT 1; DECLARE j INT DEFAULT 0; DECLARE id INT DEFAULT 0; WHILE i < 10 DO WHILE j < 1000000 DO insert into employees_m (emp_no,birth_date,first_name,last_name,gender,hire_date) VALUES( id,rand_date_string('1970-01-01','1997-01-01'),rand_string(5),rand_string(5),'M',NOW()); insert into dept_emp_m (emp_no,dept_no,from_date,to_date) values( id,concat('d00',i),rand_date_string('1990-01-01','2020-12-31'),'2020-12-31'); SET j=j+1; SET id=id+1; END WHILE; SET j = 0; SET i=i+1; END WHILE; END
插入九百萬(wàn)條數(shù)據(jù)大概用時(shí):4868s
上面的方式插入數(shù)據(jù)會(huì)很慢,可以將數(shù)據(jù)插入到內(nèi)存表,就是將表的存儲(chǔ)引擎修改為MEMORY這樣就會(huì)使用內(nèi)存去存儲(chǔ)數(shù)據(jù),會(huì)比直接插入到INNODB引擎的表中快很多,只不過(guò)就是沒(méi)有持久化,但是速度賊快,插入一千萬(wàn)條數(shù)據(jù)大概需要時(shí)間: 1227.89s
附錄
修改表存儲(chǔ)引擎
ALTER TABLE dept_emp_m ENGINE=MEMORY;
調(diào)整內(nèi)存表的大小,修改配置文件
[mysqld] max_heap_table_size = 2048M tmp_table_size = 2048M
以上就是MySQL制作具有千萬(wàn)條測(cè)試數(shù)據(jù)的測(cè)試庫(kù)的方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL 千萬(wàn)條測(cè)試數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- MySQL循環(huán)插入千萬(wàn)級(jí)數(shù)據(jù)
- MySQL 千萬(wàn)級(jí)數(shù)據(jù)量如何快速分頁(yè)
- MySQL 快速刪除大量數(shù)據(jù)(千萬(wàn)級(jí)別)的幾種實(shí)踐方案詳解
- MySQL千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化知識(shí)點(diǎn)總結(jié)
- MySql 快速插入千萬(wàn)級(jí)大數(shù)據(jù)的方法示例
- MySQL如何快速的創(chuàng)建千萬(wàn)級(jí)測(cè)試數(shù)據(jù)
- MySQL分表實(shí)現(xiàn)上百萬(wàn)上千萬(wàn)記錄分布存儲(chǔ)的批量查詢?cè)O(shè)計(jì)模式詳解
- MySQL 百萬(wàn)級(jí)分頁(yè)優(yōu)化(Mysql千萬(wàn)級(jí)快速分頁(yè))
- mysql千萬(wàn)級(jí)數(shù)據(jù)大表該如何優(yōu)化?
- Mysql limit 優(yōu)化,百萬(wàn)至千萬(wàn)級(jí)快速分頁(yè) 復(fù)合索引的引用并應(yīng)用于輕量級(jí)框架
相關(guān)文章
mysql 修改密碼和設(shè)置允許遠(yuǎn)程登錄
這篇文章主要介紹了mysql 修改密碼和設(shè)置允許遠(yuǎn)程登錄的相關(guān)資料,需要的朋友可以參考下2015-07-07MySQL OOM 系統(tǒng)二 OOM Killer
前面一節(jié)重點(diǎn)分享了Linux的內(nèi)存分配策略,基于上述的分配策略,為了規(guī)避超售的風(fēng)險(xiǎn),Linux采了一種OOM Killer的機(jī)制,即系統(tǒng)可用內(nèi)存(包括Swap)即將使用完之前,選擇性的Kill掉一些進(jìn)程以求釋放一些內(nèi)存2016-07-07MySQL之MHA高可用配置及故障切換實(shí)現(xiàn)詳細(xì)部署步驟
這篇文章主要介紹了MySQL之MHA高可用配置及故障切換實(shí)現(xiàn)詳細(xì)部署步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03淺談一下MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別
這篇文章主要介紹了MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別,存儲(chǔ)引擎是MySQL中特有的一個(gè)術(shù)語(yǔ),其它數(shù)據(jù)庫(kù)中沒(méi)有,實(shí)際上存儲(chǔ)引擎是一個(gè)表存儲(chǔ)/組織數(shù)據(jù)的方式,今天就跟小編來(lái)看看MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別,需要的朋友可以參考下2023-04-04Linux下mysql5.6.24(二進(jìn)制)自動(dòng)安裝腳本
這篇文章主要為大家詳細(xì)介紹了Linux環(huán)境下mysql5.6.24二進(jìn)制自動(dòng)安裝腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03MYSQL 數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出命令
在不同操作系統(tǒng)或MySQL版本情況下,直接拷貝文件的方法可能會(huì)有不兼容的情況發(fā)生。所以一般推薦用SQL腳本形式導(dǎo)入。下面分別介紹兩種方法。2010-11-11