MYSQL导入大量数据

MYSQL导入大量数据,第1张

跑一个推荐算法的DEMO需要导入2百万的数据

不动脑的想象用batch insert, 批量提交的方式

尝试发现其实速度并不乐观,2000条/分钟的写入速度,

200 0000 / 2000 = 100分钟,速度不能接受,尝试其他办法。

大批量数据的正确方式就文件导入方式进行,个人觉得10万数据以上用batch insert就比较吃力了。

load data方法只支持mysql 5.5版本及以上

执行步骤:

secure_file_prive=null 限制mysqld 不允许导入导出

secure_file_priv=/tmp/ 限制mysqld的导入导出只能发生在/tmp/目录下

secure_file_priv=' ' 不对mysqld的导入导出做限制

修改secure_file_prive,直接找到my.ini中secure_file_prive修改为空重启mysql即可

随意执行,如果位置不对会给出相应的提示位置,然后再将需导入的文件copy至相应位置再执行即可 (load data infile语法需自行了解。)

//最快的方法 10000记录 23MS

public static void insert() {  

        // 开时时间  

        Long begin = new Date().getTime()  

        // sql前缀  

        String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES "  

        try {  

            // 保存sql后缀  

            StringBuffer suffix = new StringBuffer()  

            // 设置事务为非自动提交  

            conn.setAutoCommit(false)  

            // Statement st = conn.createStatement()  

            // 比起st,pst会更好些  

            PreparedStatement pst = conn.prepareStatement("")  

            // 外层循环,总提交事务次数  

            for (int i = 1 i <= 100 i++) {  

                // 第次提交步长  

                for (int j = 1 j <= 10000 j++) {  

                    // 构建sql后缀  

                    suffix.append("(" + j * i + ", SYSDATE(), " + i * j  

                            * Math.random() + "),")  

                }  

                // 构建完整sql  

                String sql = prefix + suffix.substring(0, suffix.length() - 1)  

                // 添加执行sql  

                pst.addBatch(sql)  

                // 执行 *** 作  

                pst.executeBatch()  

                // 提交事务  

                conn.commit()  

                // 清空上一次添加的数据  

                suffix = new StringBuffer()  

            }  

            // 头等连接  

            pst.close()  

            conn.close()  

        } catch (SQLException e) {  

            e.printStackTrace()  

        }  

        // 结束时间  

        Long end = new Date().getTime()  

        // 耗时  

        System.out.println("cast : " + (end - begin) / 1000 + " ms")  

    }

导入时把生成索引给关掉,应该能快一点.

不要一边导入一边建立索引.

8G数据,应该也不那么慢了.

把sql语句文件读取出一部分看看,建表语句中,应当有建立索引的部分,删掉它!

只做建表和插入数据两件事.

还有,看看数据库有没有外键?

尽量在插入数据过程中去掉外键关联.

等数据插入完成之后再加索引和外键,应该能提高很多读写性能.

截取一部分数据,例如100Mb.

插入一下试试,可以预先对整体时间有一个预期.

还有,真的要弄台好点的电脑,或者去借一台,等把数据导入完成之后,把msyql的库文件直接复制出来放自己机器上跑就好.

emm..

再追加点信息,要先搞明白,sql原文件里,到底都执行了哪几类 *** 作?

可能需要你用c之类写点小工具,或者别的什么语言,分块读取并处理文件.

8G..

嗯,还好.

现在内存都够大,否则你都没法直接用软件打开了.

只有8G也可以直接用软件打开看.

停掉索引真的可以大幅度加快插入数据的速度.

建议试一试!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/7473233.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存