MySQL使用存储过程批量插入百(千)万测试数据
时间:2019-04-04 15:15 来源:linux.it.net.cn 作者:IT
最近发现蝉知的全文检索不是用的第三方类似于sphinx或xunsearch这样的全文检索组件,所以我本着好奇心测试了一下它的效率...
测试结果就不说了,主要说下折腾这1000万测试数据的过程
MySQL存储过程的创建
DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER;
具体使用网上找找资料吧,还是比较多的。
批量插入100万条测试数据
mysql> delimiter $$$
mysql> create procedure search()
-> begin
-> declare i int default 0;
-> set i=0;
-> start transaction;
-> while i<1000000 do
-> INSERT INTO `zt_searchindex` ( `objectType`, `objectID`, `title`, `content`, `addedDate`, `editedDate`) VALUES ('task', 35, ' 25968 21488', ' 25968 25454 24211', '2017-11-17 15:44:23', '2017-11-17 15:44:23');
-> set i=i+1;
-> end while;
-> commit;
-> end
-> $$$
mysql> delimiter;
其中INSERT INTO这一段根据自己的需求处理,我是给它加了一堆的一样的,内容比较长,这儿缩短了...
跑起来
call search();
用了9分钟... 好像还可以接受,但是其它有点慢。
适当的优化一下
设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度;
使用 load data local infile 提速明显;
修改参数 bulk_insert_buffer_size, 调大批量插入的缓存;
合并多条 insert 为一条.
Myisam : 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据。 ALTER TABLE tblname DISABLE KEYS;loading the data ALTER TABLE tblname ENABLE KEYS; 这两个命令用来打开或者关闭Myisam表非唯一索引的更新。在导入大量的数据到一个非空的Myisam表时,通过设置这两个命令,可以提高导入的效率。对于导入大量数据到一个空的Myisam表,默认就是先导入数据然后才创建索引的,所以不用进行设置
Innodb : 对于Innodb类型的表,有以下几种方式可以提高导入的效率:
①因为Innodb类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率。如果Innodb表没有主键,那么系统会默认创建一个内部列作为主键,所以如果可以给表创建一个主键,将可以利用这个优势提高导入数据的效率。
②在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。
③如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入结束后再执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率。
而我创建的是Innodb类型的表
所以稍微修改了一下
mysql> set session UNIQUE_CHECKS off;
mysql> set session AUTOCOMMIT off;
这样之后,我提交100万的数据就只用了差不多120秒左右...
然后我们将数据量改成了 1000万. 差不多 10分钟就跑完了。。。
至于蝉知的搜索情况,我就不多说了,有兴趣的可以试试...
(责任编辑:IT)
最近发现蝉知的全文检索不是用的第三方类似于sphinx或xunsearch这样的全文检索组件,所以我本着好奇心测试了一下它的效率... 测试结果就不说了,主要说下折腾这1000万测试数据的过程 MySQL存储过程的创建 DELIMITER // CREATE PROCEDURE myproc(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM students; END // DELIMITER; 具体使用网上找找资料吧,还是比较多的。 批量插入100万条测试数据 mysql> delimiter $$$ mysql> create procedure search() -> begin -> declare i int default 0; -> set i=0; -> start transaction; -> while i<1000000 do -> INSERT INTO `zt_searchindex` ( `objectType`, `objectID`, `title`, `content`, `addedDate`, `editedDate`) VALUES ('task', 35, ' 25968 21488', ' 25968 25454 24211', '2017-11-17 15:44:23', '2017-11-17 15:44:23'); -> set i=i+1; -> end while; -> commit; -> end -> $$$ mysql> delimiter; 其中INSERT INTO这一段根据自己的需求处理,我是给它加了一堆的一样的,内容比较长,这儿缩短了... 跑起来 call search(); 用了9分钟... 好像还可以接受,但是其它有点慢。 适当的优化一下 设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度; 使用 load data local infile 提速明显; 修改参数 bulk_insert_buffer_size, 调大批量插入的缓存; 合并多条 insert 为一条. Myisam : 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据。 ALTER TABLE tblname DISABLE KEYS;loading the data ALTER TABLE tblname ENABLE KEYS; 这两个命令用来打开或者关闭Myisam表非唯一索引的更新。在导入大量的数据到一个非空的Myisam表时,通过设置这两个命令,可以提高导入的效率。对于导入大量数据到一个空的Myisam表,默认就是先导入数据然后才创建索引的,所以不用进行设置 Innodb : 对于Innodb类型的表,有以下几种方式可以提高导入的效率: ①因为Innodb类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率。如果Innodb表没有主键,那么系统会默认创建一个内部列作为主键,所以如果可以给表创建一个主键,将可以利用这个优势提高导入数据的效率。 ②在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。 ③如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入结束后再执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率。 而我创建的是Innodb类型的表 所以稍微修改了一下 mysql> set session UNIQUE_CHECKS off; mysql> set session AUTOCOMMIT off; 这样之后,我提交100万的数据就只用了差不多120秒左右... 然后我们将数据量改成了 1000万. 差不多 10分钟就跑完了。。。 至于蝉知的搜索情况,我就不多说了,有兴趣的可以试试... (责任编辑:IT) |