mysql大量数据插入慢的问题

我现在有大量的insert into 数据不知道怎么执行起来才不是很慢

这个是需要做一些设置的。主要设置 rewriteBatchedStatements参数。原理如下:

MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。

只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。不过,驱动具体是怎么样批量执行的? 你是不是需要看一下内幕,才敢放心地使用这个选项? 下文会给出答案。

另外,有人说rewriteBatchedStatements只对INSERT有效,有人说它对UPDATE/DELETE也有效。为此我做了一些实验(详见下文),结论是: 这个选项对INSERT/UPDATE/DELETE都有效,只不过对INSERT它为会预先重排一下SQL语句。

注:本文使用的mysql驱动版本是5.1.12

实验记录:未打开rewriteBatchedStatements时

未打开rewriteBatchedStatements时,根据wireshark嗅探出的mysql报文可以看出,
batchDelete(10条记录) => 发送10次delete 请求
batchUpdate(10条记录) => 发送10次update 请求
batchInsert(10条记录) => 发送10次insert 请求

也就是说,batchXXX()的确不起作用

实验记录:打开了rewriteBatchedStatements后

打开rewriteBatchedStatements后,根据wireshark嗅探出的mysql报文可以看出

batchDelete(10条记录) => 发送一次请求,内容为”delete from t where id = 1; delete from t where id = 2; delete from t where id = 3; ….”
batchUpdate(10条记录) => 发送一次请求,内容为”update t set … where id = 1; update t set … where id = 2; update t set … where id = 3 …”
batchInsert(10条记录) => 发送一次请求,内容为”insert into t (…) values (…) , (…), (…)”

对delete和update,驱动所做的事就是把多条sql语句累积起来再一次性发出去;而对于insert,驱动则会把多条sql语句重写成一条风格很酷的sql语句,然后再发出去。 官方文档说,这种insert写法可以提高性能(”This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements”)

一个注意事项

需要注意的是,即使rewriteBatchedStatements=true, batchDelete()和batchUpdate()也不一定会走批量: 当batchSize <= 3时,驱动会宁愿一条一条地执行SQL。所以,如果你想验证rewriteBatchedStatements在你的系统里是否已经生效,记得要使用较大的batch.

更多细节看这个帖子:
blog.yemou.net/article/query/info/tytfjhfascvhzxcyt397
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-27
用第三方介质导入,速度比你执行insert语句快。比如用EXCEL或者ACCESS表格充当介质。

MySQL写入速度过慢求解决方案cmysql写入太慢
1.服务器配置不足:如果你的MySQL服务器配置不足,它将难以处理大量的并发访问,导致写入速度变慢。因此,你需要确保你的服务器具有足够的内存,磁盘空间和处理能力。2.数据表结构设计不合理:如果你的数据表结构设计不合理,将会导致大量的写入操作。你应该努力减少表连接,避免使用多余的索引和限制表中...

mysql数据库表中不断写入几十万条之后写入速度逐渐变慢?
综上所述,改用批量插入方法是解决MySQL数据库写入速度变慢问题的有效策略。通过合理利用数据库功能和优化资源使用,可以显著提升数据插入效率,确保数据库系统稳定运行。

MySQL神速一秒插入条MySQL一秒插入条
三、使用连接池 连接池的实现可以减少创建数据库连接的开销,在多线程同时处理请求的情况下,相比新建连接更容易实现数据源的共享和复用。我们可以使用阿里巴巴的Druid连接池,或者Apache的DBCP连接池等工具来实现连接池的功能。以上是我们常用的三种方法提高MySQL的插入速度。当然,如果它们不能满足你的需要,...

mysql大量数据插入慢的问题
原理如下:MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。 只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql:\/\/ip:port\/db?rewriteBatchedStatements=true)。不过,驱动具体是怎么样批量执行...

MySQL数据库处理上千万数据时速度明显变慢应该怎么办mysql上千万数据变...
4. 对硬件环境进行优化 对于需要处理海量数据的MySQL应用程序,优化硬件环境也是一项重要的工作。MySQL的性能受到多个因素的影响,例如CPU速度,内存大小,磁盘容量和读写速度等。因此,要提高MySQL的性能,需要根据实际情况,优化硬件环境。例如,增加内存、提高磁盘读写速度、选择高速的网卡等操作,都可以提高...

解决MySQL上传速度缓慢问题的有效方法mysql上传速度很慢
1. 增加内存 如果您的MySQL服务器运行在内存不足的情况下,那么会导致磁盘交换,进而降低上传速度。通过增加内存,可以避免磁盘交换,从而提高上传速度。2. 调整缓冲池大小 MyISAM引擎使用键缓冲来加速查询,而InnoDB引擎使用缓冲池来加速数据插入。调整缓冲池大小可以改善查询和插入的速度。3. 优化索引 索引...

解决Mybatis-Plus批量插入数据太慢,堪称神速
在使用Mybatis-Plus的过程中,许多开发者都因其提供的便捷API而感到愉悦。其中,saveBatch函数被广泛用于批量插入数据,但有时可能会遇到插入速度慢的问题。本文将探讨如何通过调整JDBC连接参数来提升性能。首先,理解MySQL JDBC连接中的rewriteBatchedStatements参数至关重要。默认情况下,驱动会拆分executeBatch...

为什么我的mysql导入sql文件很慢,3000多条的insert语句都要5分钟,我...
硬盘读写速度会影响输入库的写入速度的,另外看看你的mysql是不是加了好多索引,或者是不是远端数据库。。。硬盘,cpu,内存,网络和mysql配置都会对执行速度产生影响的

mysql中in大量数据导致查询速度慢怎么优化?
要实现这一优化,操作步骤包括在PolarDB MySQL环境中启用特定配置选项,具体实现细节请参考官方文档。文档提供了详细的指导,帮助用户完成设置,确保优化效果最大化。通过结合使用PolarDB MySQL和IN谓词转子查询功能,可以有效解决MySQL处理大量数据时查询速度慢的问题。这一方法不仅适用于PolarDB MySQL,也对其他...

mysql插入数据很慢,求救
如果原表很大,插入数据会非常慢,建议插入到临时表,然后用一个语句(INSERT INTO XXX SELECT * FTOM TMPXXX)把数据插入,这样速度会快一点,如果想更快,需要减少不必要的索引,如果大批量的插入,可以插入前删除索引,插入后重新建立。

相似回答