有時候需要制造一些測試的數據,以mysql官方給的測試庫為基礎,插入十萬,百萬或者千萬條數據。利用一些函數和存儲過程來完成。
官方給的測試庫地址:https://github.com/datacharmer/test_db
導入官方的數據庫,做了一些簡化,留下了部門表,員工表和雇傭表三張表,去掉了外鍵關聯。因為是測試數據,日期的對應關系不具備準確性。
必要的函數
生成隨機字符串
RAND():生成0~1之間的隨機數
FLOOR:向下整數 (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
查看自定義的所有函數
測試使用:
生成隨機年月日字符串
生成一個指定時間段內的隨機日期
SELECT
date(
from_unixtime( unix_timestamp( '2000-01-01' ) + floor( rand() * ( unix_timestamp( '2020-12-31' ) - unix_timestamp( '2000-01-01' ) + 1 ) ) ));
函數:生成指定時間段內的隨機日期
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');
//結果
2001-09-10
存儲過程生成數據
給每個部門插入一百萬員工,那么員工表就有九百萬的數據。
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
插入九百萬條數據大概用時:4868s
上面的方式插入數據會很慢,可以將數據插入到內存表,就是將表的存儲引擎修改為MEMORY這樣就會使用內存去存儲數據,會比直接插入到INNODB引擎的表中快很多,只不過就是沒有持久化,但是速度賊快,插入一千萬條數據大概需要時間: 1227.89s
附錄
修改表存儲引擎
ALTER TABLE dept_emp_m ENGINE=MEMORY;
調整內存表的大小,修改配置文件
[mysqld]
max_heap_table_size = 2048M
tmp_table_size = 2048M
以上就是MySQL制作具有千萬條測試數據的測試庫的方法的詳細內容,更多關于MySQL 千萬條測試數據的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- MySQL循環插入千萬級數據
- MySQL 千萬級數據量如何快速分頁
- MySQL 快速刪除大量數據(千萬級別)的幾種實踐方案詳解
- MySQL千萬級大數據SQL查詢優化知識點總結
- MySql 快速插入千萬級大數據的方法示例
- MySQL如何快速的創建千萬級測試數據
- MySQL分表實現上百萬上千萬記錄分布存儲的批量查詢設計模式詳解
- MySQL 百萬級分頁優化(Mysql千萬級快速分頁)
- mysql千萬級數據大表該如何優化?
- Mysql limit 優化,百萬至千萬級快速分頁 復合索引的引用并應用于輕量級框架