0
点赞
收藏
分享

微信扫一扫

MySql优化系列-进阶版造数据(load data statment)-3

云岭逸人 2022-02-11 阅读 69

文章目录

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个不重复的字符串。

生成数据量耗时
1w9.650875077 秒
10w76.531126675 秒
100w773.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
举报

相关推荐

0 条评论