MySQL制作具有千萬條測試數(shù)據(jù)的測試庫的方法
有時候需要制造一些測試的數(shù)據(jù),以mysql官方給的測試庫為基礎(chǔ),插入十萬,百萬或者千萬條數(shù)據(jù)。利用一些函數(shù)和存儲過程來完成。
官方給的測試庫地址:https://github.com/datacharmer/test_db
導入官方的數(shù)據(jù)庫,做了一些簡化,留下了部門表,員工表和雇傭表三張表,去掉了外鍵關(guān)聯(lián)。因為是測試數(shù)據(jù),日期的對應(yīng)關(guān)系不具備準確性。
必要的函數(shù)
生成隨機字符串
RAND():生成0~1之間的隨機數(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
測試使用:
select rand_string(5);
生成隨機年月日字符串
生成一個指定時間段內(nèi)的隨機日期
SELECT date( from_unixtime( unix_timestamp( '2000-01-01' ) + floor( rand() * ( unix_timestamp( '2020-12-31' ) - unix_timestamp( '2000-01-01' ) + 1 ) ) ));
函數(shù):生成指定時間段內(nèi)的隨機日期
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
測試使用:
select rand_date_string('2000-01-01','2020-12-31'); //結(jié)果 2001-09-10
存儲過程生成數(shù)據(jù)
給每個部門插入一百萬員工,那么員工表就有九百萬的數(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
插入九百萬條數(shù)據(jù)大概用時:4868s
上面的方式插入數(shù)據(jù)會很慢,可以將數(shù)據(jù)插入到內(nèi)存表,就是將表的存儲引擎修改為MEMORY這樣就會使用內(nèi)存去存儲數(shù)據(jù),會比直接插入到INNODB引擎的表中快很多,只不過就是沒有持久化,但是速度賊快,插入一千萬條數(shù)據(jù)大概需要時間: 1227.89s
附錄
修改表存儲引擎
ALTER TABLE dept_emp_m ENGINE=MEMORY;
調(diào)整內(nèi)存表的大小,修改配置文件
[mysqld] max_heap_table_size = 2048M tmp_table_size = 2048M
以上就是MySQL制作具有千萬條測試數(shù)據(jù)的測試庫的方法的詳細內(nèi)容,更多關(guān)于MySQL 千萬條測試數(shù)據(jù)的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。