关于百万级别数据入库的坑(sql中value和values的区别)

本文讲述了在处理百万级别数据入库时遇到的问题,通过对比使用ibatis框架和原生JDBC,发现使用JDBC批量插入能显著提高效率。然而,在使用JDBC时,发现`value`和`values`在SQL语句中的使用导致了性能的巨大差异,改正后,数据入库时间从十多分钟降低到十多秒。尽管通常认为`value`比`values`快,但作者的实际经验却显示`values`在大数据量插入时表现更优。文章末尾分享了一个博主的资源,供读者参考学习如何快速插入大量数据。

        最近公司需要和第三方对接同步数据,数据有几百万条来回的传输,当上百万的数据要更新入库时,我犯了难,由于项目框架过于老旧(新的框架博主没有去了解怎么去大批量入库),使用的ibatis框架在入库上百万的数据时很久(可能是框架需要解析你的sql),时间大概在5-10分钟甚至更久,这很明显不符合我的预期,经过我多方的学习,什么分批插入,sql的批量拼接等等都没有达到我的预期,最后发现大佬们用原生的JDBC去重复的生成sql然后一次性提交,这样百万级别的数据入库也就需要十多秒,如图1

图1       

         紧接着博主立马应用到我的需求里面,经过一顿改改改,终于把使用框架插入换成使用JDBC插入,然后我信心满满的启动项目跑跑跑,然后发现不对劲,怎么比我没改之前还要慢啊十多分钟都跑不完,怎么会这么奇怪呢,立马打断点。循环生成sql这一步很快。在JDBC提交这里很慢,紧接着去看表,是不是表有问题,换表在插入还是慢,各种方向一顿排查还是没有发现问题,最后去看sql,发现插入的value和values不一样,改了再跑,快了!!!从十多分钟都跑不完变成的十多秒跑完,泪目,那么一点小问题半天没有发现(刚开始博主确实不懂MySQL中value和values的区别)。

        我解决完这个问题的时候立马百度了value和values有啥区别,发现挺多博主说value要比values要快,这就很奇怪了,我跑百万数据入库的时候values要比value快超级多,根本不是在一个量级的,百思不得其解,最后如果有小伙伴想要JDBC的代码大家可以去参考这个博主的代码:教你如何6秒钟往MySQL插入100万条数据的实现_Mysql_脚本之家

在 PyCharm 企业级开发中,数据入库的常用方法有以下几种: ### 直接使用数据库驱动 对于不同的数据库,有对应的 Python 驱动可以使用。以 MySQL 为例,使用 `pymysql` 库进行数据入库操作: ```python import pymysql # 连接数据库 conn = pymysql.connect( host='localhost', user='root', password='password', database='your_database' ) # 创建游标对象 cursor = conn.cursor() # 插入数据SQL 语句 sql = "INSERT INTO your_table (column1, column2) VALUES (%s, %s)" data = ('value1', 'value2') try: # 执行 SQL 语句 cursor.execute(sql, data) # 提交事务 conn.commit() print("数据插入成功") except Exception as e: # 回滚事务 conn.rollback() print(f"数据插入失败: {e}") # 关闭游标连接 cursor.close() conn.close() ``` 这种方法适用于对数据库操作有精细控制需求的场景,需要手动管理数据库连接事务,代码复杂度相对较高。 ### 使用 ORM(对象关系映射)框架 以 Django 框架为例,Django 自带了 ORM 功能,可以方便地进行数据入库操作: ```python # 假设已经定义了一个模型类 from your_app.models import YourModel # 创建一个新的对象 new_obj = YourModel(column1='value1', column2='value2') # 保存对象到数据库 new_obj.save() ``` 使用 ORM 框架可以将数据库表映射为 Python 类,将表中的记录映射为类的实例,操作更加面向对象,代码简洁,提高了开发效率,适合快速开发维护大型项目。 ### 使用 ETL 工具 在处理大量数据时,可以使用 ETL(Extract, Transform, Load)工具进行数据入库。例如使用 Python 的 `pandas` 库结合 `SQLAlchemy` 进行数据处理入库操作: ```python import pandas as pd from sqlalchemy import create_engine # 创建数据库连接引擎 engine = create_engine("postgresql://user:password@localhost:5432/your_database") # 读取数据到 DataFrame data = { 'column1': ['value1', 'value2'], 'column2': ['value3', 'value4'] } df = pd.DataFrame(data) # 将 DataFrame 数据写入数据库 df.to_sql('your_table', engine, if_exists='append', index=False) ``` ETL 工具适合处理复杂的数据转换批量数据入库任务,能够高效地完成数据数据源到数据库的迁移。 ### 使用存储过程 对于一些复杂的业务逻辑,可以使用数据库的存储过程来实现数据入库。在 Python 中调用存储过程: ```python import pymysql # 连接数据库 conn = pymysql.connect( host='localhost', user='root', password='password', database='your_database' ) # 创建游标对象 cursor = conn.cursor() # 调用存储过程 try: cursor.callproc('your_stored_procedure', ('param1', 'param2')) # 提交事务 conn.commit() print("存储过程调用成功") except Exception as e: # 回滚事务 conn.rollback() print(f"存储过程调用失败: {e}") # 关闭游标连接 cursor.close() conn.close() ``` 存储过程可以将复杂的业务逻辑封装在数据库端,提高数据库的处理性能安全性,适合处理复杂的业务规则数据验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值