pymysql中 execute 和 executemany 性能对比,以及与原生SQL 相比如何

2023-11-13

今天在mysql中插入大批量数据时,突然想起pymysql 还有executemany 方法,那么这两个方法到底谁快?快多少?

测试环境

  • python3
  • mysql
  • pymysql

老规矩,先上测试代码:

class IN_sql():
    def __init__(self):
        print('初始化中...')
        self.connDB = pymysql.connect(host=DB_HOST,
                                      user=DB_USER,
                                      passwd=DB_PASSWD,
                                      db=DB_DB,
                                      charset='utf8mb4')
        self.connDB.ping()
        self.cu=self.connDB.cursor()

    def workOn(self):
        L=[]
        with open("./1W.txt","r",encoding="utf-8")as f:
            while True:
                res=f.readline().replace("\r","").replace("\n","")
                if not res:
                    break
                L.append(res)
        #统计插入所需时间
        start = time.time()
        sql = "insert ignore into article(an) values(%s);"
        
        #execute 执行代码
        for l in L:
            self.cu.execute(sql, l)
            
        #executemany 执行代码
        #self.cu.executemany(sql, tuple(L))
        
        self.connDB.commit()
        print('共计用时(秒):' + str(round(time.time() - start, 2)))

        self.cu.close()
        self.connDB.close()


if __name__ == '__main__':
    insert=IN_sql()
    insert.workOn()

测试结果

方法\量级\耗时(s) 1W 10W 100W
execute 3.126 25.139 248.022
executemany 0.1 0.981 10.854

总结

可以看出明显的区别,,如果需要批量插入数据库,还是用 executemany方法好些,这个和execute 完全不是一个数量级!!!

最近有朋友问到,executemany 和原生SQL 语句有好多的区别?
这里本人又进行了测试:

    def workOn(self):
        L=[]
        with open("./100W.txt","r",encoding="utf-8")as f:
            while True:
                res=f.readline().replace("\r","").replace("\n","")
                if not res:
                    break
                L.append(res)
        #统计插入所需时间
        start = time.time()
        print("start time:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start)))
        sql = "insert into article(an) values  "
        for l in L:
            sql += "('%s'), " % l
        sql = sql.rstrip(', ') + ';'
        self.cu.execute(sql)
        self.connDB.commit()
        end=time.time()
        print("end time:"+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(end)))
        print('共计用时(秒):' + str(round(end - start, 3)))

最终结果:20.176s

WHAT?FUCK?

为什么执行原生SQL 比executemany 还要慢啊?理论上原生SQL应该是最快的。

通过查询源码得知,executemany实际上也是把各个参数组合成一条SQL语句执行(insert into article(an) values (),(),(),(),(),()),优化的地方主要是在字符串的拼接上。

最后经过测试得到:本人自己的代码字符串拼接花了12s左右的时间,写入SQL语句花了8s左右,而executemany 字符串拼接仅花了2s左右。

所以,小伙伴们以后遇到大批量数据写入时尽量使用executemany 方法吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pymysql中 execute 和 executemany 性能对比,以及与原生SQL 相比如何 的相关文章

随机推荐

  • PCL 点云投影到直线(C++详细过程版)

    目录 一 算法原理 二 代码实现 三 结果展示 1 原始点云 2 投影结果 一 算法原理 直线方程有三种表示法 一般式 点向式 参数式 PCL中统一采用的是点向式 直线的点向式方程为 x x 0 m y
  • 星星之火:国产讯飞星火大模型的实际使用体验(与GPT对比)

    AIGC技术内容创作征文 全网寻找AI创作者 快来释放你的创作潜能吧 文章目录 1 前言 2 测试详情 2 1 文案写作 2 2 知识写作 2 3 阅读理解 2 4 语意测试 重点关注 2 5 常识性测试 重点关注 2 6 代码理解与生成
  • 【17 > 分布式接口幂等性】1. 概述与接口重试的问题

    一 本章概述 二 接口幂等性 2 1 定义 2 2 运用场景 2 3 保证幂等性的策略有哪些 2 4 如何实现 2 5 如何操作 一 本章概述 什么是幂等性 幂等性设计的 核心思想 select updates delete insert
  • HTML的列表标签,表格标签

    前端学习经验 3 HTML 列表标签 li 此标签定义列表项目 用于有序列表 ol 和无序列表 ul 中 无序列表标签 ul 无序列表 ul 此标签定义无序列表 例 ul li 无序列表1 li li 无序列表2 li li 无序列表3 l
  • C#驱动ESP32控制机器臂

    物料清单 介绍 NET nanoFramework 是一个免费的开源平台 可以为受限嵌入式设备编写托管代码应用程序 它适用于多种类型的项目 包括物联网传感器 可穿戴设备 学术概念验证 机器人技术 业余爱好者 创客创作甚至复杂的工业设备 通过
  • 【VTK】FindPokedRenderer函数

    最近写VTK的响应程序发现鼠标响应函数最后都会有InvokeEvent函数 部分有FindPokedRenderer 对这两个函数的运行机制还不是很了解 现在具体介绍一下 1 FindPokedRenderer 作为actor的管理工具 还
  • 基于linux下的dm9000网卡移植全分析

    DM9000可以直接与ISA总线相连 也可以与大多数CPU直接相连 Mini2440采用的是dm9000直接连接CPU s3c2440 上 就像是nandflash一样直接被挂在CUP上 被挂在s3c2440的bank4上 小插曲1 s3c
  • web项目部署到某云Linux服务器的详细步骤

    一 安装xshell 和 xftp 1 xshell连接服务器 方式有几种 这里只介绍其中之一 在 某云 密钥对创建密钥对 然后会得到下载的密钥对文件 打开xshell 打开 新建 上图中的主机填某云 实例 中的 然后在xshell 用户身
  • Python3,Pandas这4种高频使用的筛选数据的方法,不得不说,确实挺好。

    Pandas数据筛选方法 1 引言 2 4种高频使用数据筛选方法 2 1 布尔索引 2 2 isin 方法 2 3 query 方法 2 4 loc 方法 3 总结 1 引言 小屌丝 鱼哥 share一下 数据筛选的方法呗 小鱼 Excel
  • 精度 vs 效率:模型越小,精度就一定越低吗?

    导语 深度学习是否朝着正确的方向发展 以下是我最近在伦敦 O Reilly AI Conference 和 DroidCon 上的两次谈话的改编 今年早些时候 NVIDIA 的研究人员发布了 MegatronLM 这是一个拥有 83 亿个参
  • 东方财富choice金融终端研究笔记

    东方财富choice金融终端研究笔记 最近在研究 东方财富choice金融终端 我就搞不懂了 他们弄这个东西是存心不让人懂的吗 说明PDF第四页 方式一 使用激活工具 适用于有图形界面 根据所用系统环境 运行接口激活工具LoginActiv
  • 第一节:Keras深度学习框架之环境搭建

    请在学习本节前阅读我们之前的预热课程 卷积神经网络的框架解读 上 BBM的开源HUB的博客 CSDN博客 卷积神经网络的框架解读 下 BBM的开源HUB的博客 CSDN博客 从本节开始 我们将进入到Keras的详细介绍和代码精读 为开始我们
  • 02-编写单个字节设备模块的驱动套路

    目录 1 单字节设备和多字节设备的区别 2 单字节设备 LED设备驱动 的驱动套路 2 1 头文件 2 2 定义设备驱动相关的变量 2 3 编写file operations 相关操作的函数 2 3 1 open函数 2 3 2 relea
  • matlab做角谱传播代码_AI

    运筹OR帷幄 转载 作者 机器之心 编者按 对python语言有所了解的人都知道Numpy这个数学处理工具包 而它在机器学习中也有很重要的地位 通过合理的使用Numpy这个工具 可以简单快速地搭建模型的数学计算流程 可以说是一把 利剑 普林
  • 阿里云:网络编程 bind:cannot assign requested address errno:99 问题

    解决方案 阿里云上的服务器代码绑定的 IP 需要时内网 IP ifconfig 查看 其他客户端连接服务器时所用的 IP 得是阿里云的外网 IP 查看实例即可 分析思路 猜想1 bind cannot assign requested ad
  • 解决“Pycharm中用Install Package 安装第三库出错”问题的经验

    1 问题描述 在PyCharm中通过Install Package 安装第三库 requests 报错了 但是可以通过终端Terminal可以安装 报错信息如图 2 问题分析及方法对策 根据我自己的经历以及网上搜寻所得 大致总结出如下原因
  • Python Selenium UI自动化测试

    1 自动化测试基础 1 1 自动化测试的定义 将人为的测试行为转化为机器自动执行的过程 1 2 自动化测试的目的 减少成本 提高测试效率 减少人为因素对测试的影响 1 3 什么项目适合做自动化测试 项目界面稳定 需求明确 项目周期长 测试脚
  • robot framework 接口自动化测试(2)get方式传递token

    之前介绍了get请求头不需要传递参数的方式 那么对于需要传入登录状态的token接口我们怎么测试呢 下面介绍一下 首先先做post的接口自动化获取到token token实时更新 所以每次调用需要token的get接口测试都需要post的t
  • postman-post格式报文接口的配置

    post格式报文接口的配置 1 新建请求 2 配置请求报文 输入接口URL authorization界面可配置授权信息 header界面可以配置请求头 body界面可以配置请求体 非作者允许 严禁转载 http接口有许多格式 post格式
  • pymysql中 execute 和 executemany 性能对比,以及与原生SQL 相比如何

    今天在mysql中插入大批量数据时 突然想起pymysql 还有executemany 方法 那么这两个方法到底谁快 快多少 测试环境 python3 mysql pymysql 老规矩 先上测试代码 class IN sql def in