‘壹’ mysql大量数据插入慢的问题
这个是需要做一些设置的。主要设置 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
‘贰’ mysql用什么方式才可以快速导入*.sql文件
MySQL的客户端连接工具一般都要导入sql的功能,比如navicat和SQLyog,效率很高。
‘叁’ 在MySQL 中,哪些原因导致一条简单的 SQL 插入耗时很长
Count: 6 Time=25.33s (152s) Lock=0.00s (0s) Rows=0.0 (0), xxx[xxx]@xxx
INSERT INTO tablename(f_uid,uid,create_time) VALUES (N,N,N)
分析原因如下:
1.不可能是锁等待,因为记录的Lock时间为0;
2.若是InnoDB引擎,则跟主键为啥存在一定关系,但是应该不是特别大,从你的SQL语句看;
3.数据库主机的负载过高,导致处理不过,是最可能的原因;
‘肆’ 求解navicat for mysql 对1个G的sql文件导入超级慢怎么处理在线等!急急急!求指点
在my.ini最底下添加个KV对:
max_allowed_packet=100000M
然后重启Mysql,就可以按普通的方法导了,可以用mysql命令,也可以用navicat for mysql(我一般用这个)
不知道能不能写成100G,没试过,LZ试下吧。
如果改不了my.ini可以试试这个方法,我没试过,因为我一直是改my.ini的,相信你有这么大的数据库应该不是用的虚拟主机吧:
set global max_allowed_packet = 100*1024*1024*1024;
然后用:
show VARIABLES like '%max_allowed_packet%';
查看一下是否修改成功,这个应该就不用重启mysql了,重启反而失效了。
‘伍’ mysql数据库插入数据很慢,咋回事
如果原表很大,插入数据会非常慢,建议插入到临时表,然后用一个语句(INSERT
INTO
XXX
SELECT
*
FTOM
TMPXXX)把数据插入,这样速度会快一点,如果想更快,需要减少不必要的索引,如果大批量的插入,可以插入前删除索引,插入后重新建立。
‘陆’ 怎么提高mysql执行sql导入速度
linux如下设置内存盘:mount -t ramfs none /ram默认使用内存一半如果内存不够大,系统有多个硬盘,则把mysql应用程序和data目录分开到不同硬盘上。2、mysql的表设置为myiasm,比同等条件下的innodb能快20倍以上3、导入完成以后才创建数据库索引4、导入完成以后根据需要转换为其他engine,比如innodb5、多条数据插入一个表,可以使用多记录方式:insert into tablename values('xxx','xxx'),('yyy','yyy')...;6、如果多个mysql执行导入,可以使用delayedinsert delayed into tablename values('sss','ssss');7、大文件sql文件可以用split分成多份再导8、同等条件下,redhat比ubuntu强很多(几乎肯定)
‘柒’ mysql如何快速导入外部1.2G的sql文件用source很慢,都几个小时卡着
你打开那个.sql文件看过没有,不仅仅只有数据,还包含表结构。在导入的时候先是创建表,然后再插入数据的。
‘捌’ 为什么我的mysql导入sql文件很慢,3000多条的insert语句都要5分钟,我朋友电脑却不超
硬盘读写速度会影响输入库的写入速度的,另外看看你的mysql是不是加了好多索引,或者是不是远端数据库。。。硬盘,cpu,内存,网络和mysql配置都会对执行速度产生影响的
‘玖’ mysql导入sql文件命令导入数据库快不快
其实导入的方法很简单,可以采用工具导入和只用mysql命令界面导入两种方式,mysql的数据库图形界面工具是很多的,用起来也比较方便。
工具/原料
navicat
for
mysql
mysql命令行界面
sql脚本
方法一:
1、首先使用mysql提供的命令行界面来导入数据库,确保电脑中安装了mysql数据库,可以通过命令行来确认是否安装了mysql数据库,当然,第一步是打开mysql的数据库服务,使用命令行来打开:
2、启动mysql后,找到需要用到的脚本文件,也就是数据库文件,当然,首先得建立一个数据库,这样才可以导入脚本,如下图所示:
3、在将脚本拷到本地磁盘的根目录,这样方便进入找到脚本,这里以d盘来说明,使用test.sql:接着来到命令行,使用source
d:/test.sql;来导入数据库,先进入mysql。
4、首先要在数据库中建立好数据库,然后导入脚本,所以先建立一个数据库哦,不要脚本是不知道要往哪个数据库中导入脚本的。
5、然后就可以输入导入.sql文件命令:
mysql>
use
数据库名;
mysql>
source
d:/test.sql;
6、看到上面的画面,说明mysql数据库已经导入成功了。
方法二:使用navicat
for
mysql图形界面来导入数据库,使用图形界面导入数据库的步骤很简单
1、在图形界面中建立好数据库之后,使用导入脚本的功能来导入数据库
2、点击选择脚本,选择d盘的test.sql脚本,然后设置数据库字符格式
3、接着点击开始运行脚本就行了,脚本开始导入了哦!导入完成之后就会出现成功的提示
4、然后先关闭数据库,再打开数据库就可以看到建立好的数据库的表了。