一个简单的表

explain执行计划查看sql(insert into a select * from b)
初始不给age加索引,此时此表只有一个主键索引

explain执行计划查看sql(insert into a select * from b)
此时select行可以看到type=all,全表扫描(从磁盘)
在默认的事务隔离级别下:insert into a select * from b 加锁规则是:a表锁,b表逐步锁(扫描一个锁一个)。也就意味着在执行insert into select from 语句时,mysql会从上到下扫描b表内的记录并且加锁,这样一来不就和直接锁表是一样了。
此时为age添加索引,避免全表扫描。
explain执行计划查看sql(insert into a select * from b)
再次执行explain执行计划查看sql(insert into a select * from b)
此时select还是type=all,并且没有用到age索引(select 的 * 中有name)
强制使用age索引(force index (索引名))
explain执行计划查看sql(insert into a select * from b)

相关文章: