How to improve INSERT INTO ... SELECT locking behavior
You can set binlog format like that:
SET GLOBAL binlog_format = 'ROW';
Edit my.cnf if you want to make if permanent:
[mysqld]
binlog_format=ROW
Set isolation level for the current session before you run your query:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
INSERT INTO t1 SELECT ....;
If this doesn't help you should try setting isolation level server wide and not only for the current session:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Edit my.cnf if you want to make if permanent:
[mysqld]
transaction-isolation = READ-UNCOMMITTED
You can change READ-UNCOMMITTED to READ-COMMITTED which is a better isolation level.
The answer to this question is much easier now: - Use Row Based Replication and Read Committed isolation level.
The locking you were experiencing disappears.
Longer explaination: http://harrison-fisk.blogspot.com/2009/02/my-favorite-new-feature-of-mysql-51.html