mysql百万数据写入_快速写入百万数据
1.快速写入百万数据
mysql原生操作
mysql原生操作写入500万数据!
# 建库
create database mydb01;
# 使用库
use mydb01;
# 建表
create table tbl_students(
id int primary key auto_increment,
name varchar(20) unique,
gender varchar(6),
email varchar(40)
);
.
import pymysql
import gevent
import time
class DBUtil:
def __init__(self, host, port, username, password, db, charset='utf8'):
self.host = host # mysql主机地址
self.port = port # mysql端口
self.username = username # mysql远程连接用户名
self.password = password # mysql远程连接密码
self.db = db # mysql使用的数据库名
self.charset = charset # mysql使用的字符编码,默认为utf8
self.connect() # __init__初始化之后,执行的函数
def connect(self):
# pymysql连接mysql数据库
# 需要的参数host,port,user,password,db,charset
self.conn = pymysql.connect(host=self.host,
port=self.port,
user=self.username,
password=self.password,
db=self.db,
charset=self.charset
)
# 连接mysql后执行协程方法
self.asynchronous()
#线程
def run(self, nmin, nmax):
# 创建游标
self.cur = self.conn.cursor()
# 定义sql语句,插入数据id,name,gender,email
sql = "insert into tbl_students(id,name,gender,email) values (%s,%s,%s,%s)"
# 定义总插入行数为一个空列表
data_list = []
for i in range(nmin, nmax):
# 添加所有任务到总的任务列表
result = (i, 'mayun' + str(i), 'male', 'mayun' + str(i) + '@qq.com')
data_list.append(result)
# 执行多行插入,executemany(sql语句,数据(需一个元组类型))
content = self.cur.executemany(sql, data_list)
if content:
print(f'成功插入第{nmax - 1}条数据')
# 提交数据,必须提交,不然数据不会保存
self.conn.commit()
def asynchronous(self):
# g_l 任务列表
# 定义了异步的函数: 这里用到了一个gevent.spawn方法
max_line = 10000 # 定义每次最大插入行数(max_line=10000,即一次插入10000行)
g_l = [gevent.spawn(self.run, i, i + max_line) for i in range(1, 5000001,
max_line)]
# gevent.joinall 等待所以操作都执行完毕
gevent.joinall(g_l)
self.cur.close() # 关闭游标
self.conn.close() # 关闭pymysql连接
if __name__ == '__main__':
start_time = time.time() # 计算程序开始时间
st = DBUtil('127.0.0.1', 3306,'root','root','mydb01','utf8') # 实例化类,传入必要参数
print('程序耗时{:.2f}'.format(time.time() - start_time))
# 计算程序总耗时
2.增加删除修改的mysql语句如何优化
[Flask]sqlalchemy批量插入数据(性能问题)
方式1:
first_time = datetime.utcnow()
for i in range(10000):
user = User(username=username + str(i), password=password)
db.session.add(user)
db.session.commit()
second_time = datetime.utcnow()
print((second_time - first_time).total_seconds())
# 38.14347s
.
方式2:
second_time = datetime.utcnow()
db.session.bulk_save_objects(
[
User(username=username + str(i), password=password)
for i in range(10000)
]
)
db.session.commit()
third_time = datetime.utcnow()
print((third_time - second_time).total_seconds())
# 2.121589s
.
方式3:
third_time = datetime.utcnow()
db.session.bulk_insert_mappings(
User,
[
dict(username="NAME INSERT " + str(i), password=password)
for i in range(10000)
]
)
db.session.commit()
fourth_time = datetime.utcnow()
print((fourth_time - third_time).total_seconds())
# 1.13548s
.
方式4:
fourth_time = datetime.utcnow()
db.session.execute(
User.__table__.insert(),
[{"username": 'Execute NAME ' + str(i), "password": password} for i in range(10000)]
)
db.session.commit()
five_time = datetime.utcnow()
print((five_time - fourth_time).total_seconds())
# 0.888822s
3.flask/Django的ORM方法如何优化
Django之ORM性能优化
1.利用标准数据库优化技术
索引,给关键的字段添加索引
如:给表的关联字段,搜索频率高的字段加上索引等
使用适当字段类型
本来varchar就搞定的字段,就别要text类型
2.了解Django的QuerySets
QuerySets是有缓存的,一旦取出来,它就会在内存里呆上一段时间,尽量重用它。
# 了解缓存属性:
>>> entry = Entry.objects.get(id=1)
>>> entry.blog # 博客实体第一次取出,是要访问数据库的
>>> entry.blog # 第二次再用,那它就是缓存里的实体了,不再访问数据库
>>> entry = Entry.objects.get(id=1)
>>> entry.authors.all() # 第一次all函数会查询数据库
>>> entry.authors.all() # 第二次all函数还会查询数据库
all,count exists是调用函数(需要连接数据库处理结果的),注意在模板 template里的代码,
模板里不允许括号,但如果使用此类的调用函数,一样去连接数据库的,能用缓存的数据就别连接到数据库去处理结果。还要注意的是,自定义的实体属性,如果调用函数的,记得自己加上缓存策略。
利用好模板的with标签:
模板中多次使用的变量,要用with标签,把它看成变量的缓存行为吧。
使用QuerySets的iterator():
通常QuerySets先调用iterator再缓存起来,当获取大量的实体列表而仅使用一次时,缓存行为会耗费宝贵的内存,这时iterator()能帮到你,iterator()只调用iterator而省 去了缓存步骤,显著减少内存占用率,具体参考相关文档。
3.数据库的工作就交给数据库本身计算,别用Python处理
1.使用 filter and exclude 过滤不需要的记录,这两个是最常用语句,相当是SQL的where
2.同一实体里使用F()表达式过滤其他字段
3.使用annotate对数据库做聚合运算
4.使用QuerySet.extra() extra虽然扩展性不太好,但功能很强大,如果实体里需要需要增加额外属性,不得已时,通过extra来实现,也是个好办法
5.使用原生的SQL语句 如果发现Django的ORM已经实现不了你的需求,而extra也无济于事的时候,那就用原生SQL语句
4.如果需要就一次性取出你所需要的数据
单一动作(如:同一个页面)需要多次连接数据库时,最好一次性取出所有需要的数据,减少连接数据库次数。
相反,别取出你不需要的东西。
使用QuerySet.count()代替len(queryset),虽然这两个处理得出的结果是一样的,但前者性能优秀很多。同理判断记录存在时,QuerySet.exists()比if queryset实在强得太多了
5.懂减少数据库的连接数
使用 QuerySet.update() 和 delete(),这两个函数是能批处理多条记录的,适当使用它们事半功倍;如果可以,别一条条数据去update delete处理。
对于一次性取出来的关联记录,获取外键的时候,直接取关联表的属性,而不是取关联属性,如:
entry.blog.id
优于
entry.blog__id
# 善于使用批量插入记录,如:
Entry.objects.bulk_create([
Entry(headline="Python 3.0 Released"),
Entry(headline="Python 3.1 Planned")
])
优于
Entry.objects.create(headline="Python 3.0 Released")
Entry.objects.create(headline="Python 3.1 Planned")
# 前者只连接一次数据库,而后者连接两次
# 还有相似的动作需要注意的,如:多对多的关系,
my_band.members.add(me, my_friend)
优于
my_band.members.add(me)
my_band.members.add(my_friend)
优化Mysql数据库的8个方法
本文通过8个方法优化Mysql数据库:创建索引、复合索引、索引不会包含有NULL值的列、使用短索引、排序的索引问题、like语句操作、不要在列上进行运算、不使用NOT IN和<>操作
参考:MySQL数据库优化的八种方式(经典必看)
https://blog.csdn.net/orecle_littleboy/article/details/88534160
mysql百万数据写入_快速写入百万数据相关推荐
- mysql双节点安装_快速安装及配置MySQL Replication双主节点集群--及改变数据保存目录...
192.168.1.101 master/slave 192.168.1.102 slave 192.168.1.103 slave 操作系统均为centos6.5 原理图: 1. 分别安装my ...
- excel 两组数据交点_如何在百万级的数据里找到别人正在赚钱的项目?【实操长文】...
前不久,我在好友的知乎星球看到了这篇知乎文章,后面又在生财有术星球看到了原作者小曾分享.更巧的是,小曾也在白杨SEO星球嘉宾令狐峰的极客微信群里,所以就这样认识了. 君言这篇文章,我详细看过了,真心很 ...
- excel 两组数据交点_如何在百万级的数据里找到别人正在赚钱的项目
本篇内容可能会涉及部分编程知识,但都是基础中的基础,不用担心,其余都是通俗易懂. 我寻找项目的重点在于挖掘海量用户的需求,再去做自动化归类,数据量越大,归类越智能,找到的需求就越清晰. 分为两个方向挖 ...
- 程序员小sister的烦恼_快速上手大数据ETL神器Kettle(xls导入mysql)
我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励. 2021年「博客之星」参赛博主:Maynor大数据 https://bbs.csdn.net/topics/60395 ...
- php 导出mysql 数据库表结构图_导入和导出数据表的图文介绍(phpMyAdmin的使用教程5)...
导入和导出数据表的图文介绍(phpMyAdmin的使用教程5) 导入和导出数据是互逆的两个操作,导入数据是通过扩展名为.sql的文件导入到数据库中,导出数据是将数据表结构,表记录储存为.sql的文件, ...
- excel数据透视_取消透视Excel数据的快速方法
excel数据透视 Before you can build a flexible pivot table, you might need to rearrange the data. For exa ...
- mysql查看数据倾斜_深入理解hadoop数据倾斜
深入理解hadoop之数据倾斜 1.什么是数据倾斜 我们在用map /reduce程序执行时,有时候会发现reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理 ...
- python大数据项目_(价值1280)大数据项目实战之Python金融应用编程
朱彤老师,2009年博士毕业于北京大学光华管理学院金融系,对金融.数据分析与统计有着较为深刻的理解,多年来一直持续跟踪和研究金融量化分析与数据统计相关领域的进展与发展,对概率论.随机过程及其在金融中的 ...
- python爬取淘宝数据魔方_《淘宝数据魔方技术架构解析》阅读笔记
淘宝网拥有国内最具商业价值的海量数据.截至当前,每天有超过30亿的店铺.商品浏览记录,10亿在线商品数,上千万的成交.收藏和评价数据.如何从这些数据中挖掘出真正的商业价值,进而帮助淘宝.商家进行企业的 ...
最新文章
- caffe学习(二):利用mnist数据集训练并进行手写数字识别(windows)
- android:background大小,小Demo小知识-android:foreground与android:background
- linux php oracle 乱码,linux安装oracle出现界面乱码
- matlab 矩阵矢量化编程
- BP神经网络从理论到应用(一):C++实现
- ALSA声卡驱动二之声卡的创建
- ospf中DR/BDR选举及接口网络类型
- 6.1神经网络--python机器学习
- 我们应该如何看待牛市熊市?到了牛市熊市有什么标志吗?
- 全新2009高校BBS上充满温馨的100个调情小笑话
- 全志A64 lichee编译脚本build.sh分析
- Stock Swoosh选择DRM-X 4.0 HHMeet(Zoom 会议保护)来保护其股票课程
- UBUNTU教程之菜鸟飞飞
- 百度搜狗SEO快速排名模拟点击工具-提升关键词排名
- 关于工伤事故索赔计算很好用的一款APP
- android平板车载,把android平板电脑装进车机 自己动手diy安卓车载电脑
- 程序员解锁520告白“新姿势”,你get了吗?
- 科创板自律委就规范科创板IPO中介机构收费提行业倡议,416家公司中介总费用率6.28%
- CCNA-第五篇-基础命令集+设备升级+设备破解密码+IP地址{精髓篇}
- cbv装饰器 中间件 跨站请求伪造