众所周知,Mysql是一个关系型数据库。在Mongo未普及之前,几乎垄断了整个市场。Mongo的问世,其操作简易,存储方便很快就被大家所熟知、使用。两个数据库各有春秋。下面给大家介绍一个Mysql数据导入到Mongo的Demo,我自己写的简易版的。经过测试。20万的数据用了4个多小时,很慢很慢,因为没有加多任务。直接进行查询的。各位可以根据需要进行扩充。上代码:
# -*- coding: utf-8 -*-
import pandas as pd
import MySQLdb
import json
import time
from pymongo import MongoClient
####### Mysql配置 #######
# HOST = "localhost"
# USER = "账号"
# PASSWORD = "密码"
# DATABASES = "数据库名称"
# MYSQL_TABLE = "数据表名称"
####### Mongo配置 #######
MONGO_URI = 'localhost'
MONGO_DB = '数据库名称'
COLLECTION = "数据库集合/表名称"
class MongoBase:
def __init__(self):
"""
链接数据库
: params conn: 链接mysql数据库
: params con: 链接mongo数据库
: params db: 链接mongo数据库名
: params collection: 链接mongo数据文档
"""
self.conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, db=DATABASES,
charset="utf8")
self.con = MongoClient(host=MONGO_URI)
self.db = self.con[MONGO_DB]
self.collection = self.db[COLLECTION]
self.mysql_table = MYSQL_TABLE
def read_mysql(self):
"""读取mysql表"""
sql = """ SELECT * from {} """.format(self.mysql_table)
df = pd.read_sql(sql, self.conn)
df_count = len(df)
end = time.time()
print("查询完毕,条数:", df_count, "用时", end - start)
df.drop_duplicates('title', keep='first', inplace=True)
data = json.loads(df.T.to_json()).values()
return data, df_count
def closeDB(self):
"""关闭数据库"""
self.con.close()
def get_max_id(self):
max_id = self.collection.find().sort([('primary_key', -1)]).limit(1)[0]
if max_id:
return max_id.get("primary_key")
def run(self):
data,df_count = self.read_mysql()
data_count = len(data)
total_count = df_count - data_count
for i in data:
mongo.collection.update_one({"title": i['title']}, {'$set': dict(i)}, upsert=True)
return total_count, data_count
if __name__ == '__main__':
start = time.time()
mongo = MongoBase()
total_count, data_count = mongo.run()
mongo.closeDB()
end = time.time()
print("运行完成所用时", end - start, "重复数据{}条".format(total_count), "共插入mongo数据{}条".format(data_count) )
首先,我使用 MySQLdb+pandas 读取mysql数据并生成一个字典data, 接着将字典存到mongo中,结束
思路很简单。需要优化的部分就是读取mysql和存Mongo这里。如果需要优化的话,我的思路是先分片进行查询。然后再分片进行存储。可以将每一段使用多任务。因为这是IO操作。在硬件允许的情况。尽可能多的分。那么效率就会提升很大。另外,读取mysql生成的data,可以结合celery进行异步操作,进一步解阻塞,提升效率