MySql 大批量导入数据时关闭索引

30 篇文章 1 订阅

1.建表

create table goods(
id int primary key,
name varchar(20),
key(name)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

2.插入数据

delimiter $$
create procedure p1(in num int)
begin
  declare name varchar(20) default '';
   declare i int default 0;
   while i<= num do
      set name = concat('April',i);
      insert into goods values(i,name);
      set i = i+1;
   end while;
end $$
delimiter ;

向goods表中插入1百万条数据。直接插入

mysql>call p1(1000000);
Query OK, 1 row affected (2 min 3.33 sec)

先关闭索引,插入数据,再打开索引

mysql> ALTER TABLE goods DISABLE KEYS;
Query OK, 0 rows affected (0.00 sec)
 
mysql> call p1(1000000);
Query OK, 1 row affected (1 min 14.81 sec)
 
mysql> ALTER TABLE goods ENABLE KEYS;
Query OK, 0 rows affected (26.47 sec)

3.复制数据

    新建表goods2,将goods表中的数据导入goods2。

create table goods2(
id int primary key,
name varchar(20),
key(name)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

直接复制数据。

mysql> INSERT INTO goods2 SELECT * FROM goods;
Query OK, 1000001 rows affected (30.35 sec)
Records: 1000001  Duplicates: 0  Warnings: 0

先关闭索引,复制数据,再打开索引

mysql> ALTER TABLE goods2 DISABLE KEYS;
Query OK, 0 rows affected (0.00 sec)
 
mysql> INSERT INTO goods2 SELECT * FROM goods;
Query OK, 1000001 rows affected (3.57 sec)
Records: 1000001  Duplicates: 0  Warnings: 0
 
mysql> ALTER TABLE goods2 ENABLE KEYS;
Query OK, 0 rows affected (26.73 sec)

4.结论

    在对空表大批量数据写数据时,先禁用索引, 在完全导入后, 再启用索引。比一次性完成效率高。上面只是对这个mysiam类型的表进行导入数据的一个优化,但是对于innodb这样的表,这种方式并不能提高导入数据的效率,可以有以下几种方式来提高导入数据的效率

  • 因为innodb的表是按照主键的顺序来保存的,所以将导入的数据按照主键的顺序排列,可以有效地提高导入数据的效率。
  • 在导入数据之前关闭唯一性校验,及设置set unique_checks=0,就是对它进行一个关闭,等插入完之后,再进行一个恢复即可。
  • 在设置的时候关闭自动提交,set autocommit=0,然后当插入完成之后,再进行设置为1。
要在MySQL中新增大批量数据,可以通过以下几种方法来实现。 第一种方法是使用INSERT INTO语句。可以将需要插入的数据按照一定的格式(例如CSV格式)保存在一个文本文件中,然后使用LOAD DATA INFILE语句将文本文件中的数据直接导入MySQL数据库中。这个方法的好处是可以快速插入大量数据,但需要事先将数据保存在文本文件中。 第二种方法是使用INSERT INTO语句的批量插入形式。可以将多个INSERT INTO语句合并为一个INSERT INTO语句,并使用VALUES子句一次性插入多条数据。这种方法比较适用于数据较小的情况,不需要保存为文本文件。 第三种方法是使用INSERT INTO SELECT语句。可以先创建一个临表,将需要插入的数据保存到临表中,然后使用INSERT INTO SELECT语句将临表中的数据插入到目标表中。这种方法比较适用于需要对插入的数据进行一定的处理或筛选的情况。 无论使用哪种方法,对于大批量数据的插入,还可以考虑以下几点优化: 1. 在插入之前,将目标表的索引和约束暂禁用,以提高插入的速度; 2. 设置合适的事务大小,将多个插入操作批量提交,减少事务的开销; 3. 根据数据的特点,合理选择合适的插入顺序,以提高插入的效率; 4. 使用多线程或并行插入提高并发处理能力。 总之,根据具体的需求和场景,可以选择合适的方法和优化策略来实现MySQL大批量数据插入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值