The particular example given here is unsafe and slow.

* Without an ORDER BY, you are not guaranteed that the chunks will be distinct.

* If there are any INSERTs/DELETEs between chunk copies, you will get 
dups/missing rows for two reasons:  the inserted/deleted rows, and the OFFSET 
is not quite right.

* OFFSET requires walking over the skipped rows.  As you get farther into the 
table, this takes longer.  That is, you have an ORDER(N**2) operation, not what 
could be ORDER(N).

* If replication is involved, 1M rows is a lot -- there will be noticeable 
delays where other replication activity is stalled.

If you have an AUTO_INCREMENT PRIMARY KEY, then using WHERE id > 1000000 AND id 
<= 2000000 is a better approach -- Order(N), and chunks guaranteed to be 
distinct.  Still, it is not immune from INSERTs/DELETEs.  Replication is fixed 
by decreasing chunk size (and by avoiding OFFSET).

> -----Original Message-----
> From: Arjun [mailto:na...@yahoo.com]
> Sent: Tuesday, July 02, 2013 12:48 AM
> To: mysql@lists.mysql.com
> Subject: Re: best way to copy a innodb table
> 
> Well, the easy way to chunk the inserts is by use of limit. Here is what I
> used for one of my projects:
> 
> Insert ignore into t1 (f1, f2, f3)
> Select f1, f2, f3 from t2 limit 1000000, 1000000
> 
> Inserts 1M records at a time starting from 1M th record in t2 and you can
> keep incrementing this offset as you progress. This will help in
> monitoring the table inserts and at the same time move chunks of records
> from source table.
> 
> Enjoy!
> 
> 
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/mysql


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql

Reply via email to