MySql优化系列-进阶版造数据(load data statment)-3
概述
有时候需要进行造数据的时候,需要很大的灵活性,并且需要进行巨大数据量的生成,如果耗费的时间太多,则十分浪费时间,因为时间都耗费在基础数据的准备上了,而不是解决问题。
MySQL官网指明LOAD DATA statement导入数据十分快(at a very high speed)我们亲自验证一下(get your hand dirty)。
The LOAD DATA statement reads rows from a text file into a table at a very high speed. The file can be read from the server host or the client host, depending on whether the LOCAL modifier is given. LOCAL also affects data interpretation and error handling
数据的准备(JAVA版本)
下表是生成不同数据量的用户记录所耗费时间表格。即一条记录包含id,user_code,user_name,总共3个不重复的字符串。
生成数据量 | 耗时 |
---|---|
1w | 9.650875077 秒 |
10w | 76.531126675 秒 |
100w | 773.285521689 秒 |
/**
* 生成自增字符串
* 思路:数字进位我们都知道(即9->10,99->10),
* 同理加了小写字母、大些字母、常用汉字进去后,我们也用这样的理论去进位
* 这样,我们就不用担心生成重复的字符串了。
* 进位规则:将所有字符都填充到generateMaterialList,默认索引下标大的,值大。
* 即若[0,9,A,Z,a,z,的,我],则9之后字符就是A;Z之后的字符就是a;我之后就是00,当然可以写成01.
*
* @param previousStr 上一个字符串
* @param length 要生成字符串的长度
* @param generateMaterialList 要生成字符串的素材(例如["0","1","a","b","A","B","的","我"])
* @return
*/
private static String doGenerateAscStr(String previousStr, int length, List<String> generateMaterialList) {
//构造查找表
Map<String, Integer> allCharGroup = generateMaterialList.stream().collect(
Collectors.toMap(
item -> {
return item; },
item -> {