文章目录
MySql优化系列-进阶版造数据(load data statment)-3
概述
有时候需要进行造数据的时候,需要很大的灵活性,并且需要进行巨大数据量的生成,如果耗费的时间太多,则十分浪费时间,因为时间都耗费在基础数据的准备上了,而不是解决问题。
MySQL官网指明LOAD DATA statement导入数据十分快(at a very high speed)我们亲自验证一下(get your hand dirty)。
数据的准备(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 -> {
for (int i = 0; i < generateMaterialList.size(); i++) {
if (item.equals(generateMaterialList.get(i))) {
return i;
}
}
return -1;
})
);
String[] previousStrArray = previousStr.split("");
String biggestStr = generateMaterialList.get(generateMaterialList.size() - 1);
for (int i = previousStrArray.length - 1; i >= 0; i--) {
//增加1即可
if (!previousStrArray[i].equals(biggestStr)) {
previousStrArray[i] = generateMaterialList.get(allCharGroup.get(previousStrArray[i]) + 1);
return Arrays.stream(previousStrArray).collect(Collectors.joining(""));
}
//进位
previousStrArray[i] = generateMaterialList.get(0);
//最高位设置为1,若字符串因进位而改变字符串的长度的话(即字符串长度+1)。
if (i <= 0) {
List<String> tempList = new ArrayList<>(16);
tempList.add(generateMaterialList.get(1));
tempList.addAll(Arrays.stream(previousStrArray).collect(Collectors.toList()));
return tempList.stream().collect(Collectors.joining(""));
}
}
return Arrays.stream(previousStrArray).collect(Collectors.joining(""));
}
参考
- MySQL数据库快速造大量数据
- 官网LOAD DATA Statement