> 数据库 > MySQL >

MySQL使用存储过程批量插入百(千)万测试数据

最近发现蝉知的全文检索不是用的第三方类似于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)