Mysql 数据导入至 Mongo 简易版思路

2 篇文章 0 订阅
1 篇文章 0 订阅

众所周知,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进行异步操作,进一步解阻塞,提升效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值