前言
我们这里 来探讨一下 insert into $fields select $fields from $table;
的相关实现, 然后 大致来看一下 为什么 他能这么快
按照 我的思考, 应该里里面有 批量插入才对, 但是 调试结果 发现令我有一些意外
呵呵 果然 只有调试才是唯一的真理
测试数据表如下
CREATE TABLE `tz_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) DEFAULT NULL,
`field2` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `field_1_2` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8
CREATE TABLE `tz_test_02` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) DEFAULT NULL,
`field2` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `field_1_2` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8
tz_test 的数据如下
insert into select 的实现
执行 sql 如下 “insert into tz_test_02 select * from tz_test;”
源表数据行的迭代
这里的 sub_select 是查询以及迭代 源表, 然后 之后传递到 下游的 Query_result_insert 进行处理一行的数据
整个流程大致如下, 显示 将源行的数据拷贝到目标行, 然后 在持久化到目标表
源表到目标表 数据行的拷贝
数据的拷贝, 将数据从 源表的源字段列表 拷贝到 目标表的目标字段列表
目标表 数据行的持久化
然后向目标表中插入记录的实现在这里
然后 之所以效率高, 是因为 他只需要 mysql 内部迭代
没有和外部程序交互的开销, 因此 它的效率 “较高”
完