我们使用下面这种方式做的拷贝: Insert into logs_b(…,…,…) Select …,…,… from logs_a Where log_date >= to_date(‘20120229’, ‘yyyymmdd’);现在问题是,这个sql要运行N久,也无法终止,问下有什么好的方法能够快速实现表数据复制没? 办法一: 分页导入,比如Insert into logs_b(…,…,…) Select …,…,… from logs_a Where log_date >= to_date(‘20120229’, ‘yyyymmdd’) limit 0,1000; 办法二: 先select into outfile然后再load data infile select a,b,c from oldtable into outfile 'a.txt'; load data INFILE 'a.txt' into table newtable (a,b,c ) ; 当从一个文本文件装载一个表时,使用load data infile。这通常比使用很多insert语句快几十倍。 load data infile 并不是先把数据 select 进来,load data infile 之前,可以先用 myisamchk --keys-used=0 -rq /path/to/db/tbl_name 从表中取消所有索引的使用。当导入完后 用myisamchk -r -q /path/to/db/tbl_name重新创建索引。这将在写入磁盘前在内存中创建索引树,并且它更快,因为避免了大量磁盘搜索。结果索引树也被完美地平衡 办法三: 在myisam engine下 1 尽量使用insert into table_name values (...), (.....),(.....)这样形式插入数据,避免使用inset into table_name values (); inset into table_name values (); inset into table_name values (); 2 增加bulk_insert_buffer_size(默认8M) 3 如果是非空表,使用alter table table_name disable keys,然后load data infile,导入完数据在执行: alter table table_name enable keys. 如果是空表,就不需要这个操作,因为myisam表在空表中导入数据时,是先导入数据然后建立indexs。 4 在插入数据时考虑使用:insert delayed....这样操作实际mysql把insert操作放到队列里面,进行相对集中的插入,速度更快。 使用load data infile 比使用insert 操作快近20倍,尽量使用此操作。 在innodb engine下
硬件上提高磁盘的I/0对插入速度很有好处(所以如果进行大数据量的导入导出工作,尽量在比较NB的硬件上进行,能缩减完成的时间,已经防止出现问题) From:http://my.oschina.net/sansom/blog/153433 转载请保留固定链接: https://linuxeye.com/database/1901.html |