• 43 mysql insert select 的实现


    前言

    我们这里 来探讨一下 insert into $fields select $fields from $table;

    的相关实现, 然后 大致来看一下 为什么 他能这么快

    按照 我的思考, 应该里里面有 批量插入才对, 但是 调试结果 发现令我有一些意外

    呵呵 果然 只有调试才是唯一的真理

     

    测试数据表如下 

    1. CREATE TABLE `tz_test` (
    2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    3. `field1` varchar(128) DEFAULT NULL,
    4. `field2` varchar(128) DEFAULT NULL,
    5. PRIMARY KEY (`id`) USING BTREE,
    6. UNIQUE KEY `field_1_2` (`field1`) USING BTREE
    7. ) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8
    8. CREATE TABLE `tz_test_02` (
    9. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    10. `field1` varchar(128) DEFAULT NULL,
    11. `field2` varchar(128) DEFAULT NULL,
    12. PRIMARY KEY (`id`) USING BTREE,
    13. UNIQUE KEY `field_1_2` (`field1`) USING BTREE
    14. ) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8

     

    tz_test 的数据如下 

    2e503e95cf51445eb7350553d7bd85b5.png

     

     

    insert into select 的实现

    执行 sql 如下 “insert into tz_test_02 select * from tz_test;”

     

    源表数据行的迭代

    这里的 sub_select 是查询以及迭代 源表, 然后 之后传递到 下游的 Query_result_insert 进行处理一行的数据 

    cd227a5071094f8388a1628abb152233.png

     

    整个流程大致如下, 显示 将源行的数据拷贝到目标行, 然后 在持久化到目标表

    bbde27e102fc417f9d8622d83beb3180.png 

     

    源表到目标表 数据行的拷贝

    数据的拷贝, 将数据从 源表的源字段列表 拷贝到 目标表的目标字段列表

    4d6e16d2d08d48779428eae0799a37af.png

    dc53d567108f4d8a90a87ecd518000c2.png 

    e34f60b0850f4865a4ae4164850d1193.png 

     

    目标表 数据行的持久化

    然后向目标表中插入记录的实现在这里  

    f713f6d02df9470ab12e72610beaa71f.png

     

    然后 之所以效率高, 是因为 他只需要 mysql 内部迭代

    没有和外部程序交互的开销, 因此 它的效率 “较高”

     

     

     完

     

     

     

  • 相关阅读:
    医学图像处理中的数据读写
    软件需求分析——需求的理论基础
    数字化办公需求激增,企业OA系统该如何升级?
    一个用mediapipe计算脸部朝向的简单方法
    Opncv 实现拍照、颜色识别和阈值选取
    面试官:说一下 px、em、rem、vw/vh?em和rem的区别?
    vim之一键替换
    Elasticsearch映射操作(八)
    iptables的50条常用命令
    REGEXP函数正则表达式
  • 原文地址:https://blog.csdn.net/u011039332/article/details/131865006