一个10万行的ngx日志,解析后如何快速的插入mysql?

新手上路,请多包涵

大家好。
nginx log 目前每天大概10万行数据,现在用python解析出了每个字段,现在想插入到mysql数据库里,用for实在太慢,请问有什么好的方法来搞。

阅读 2.2k
3 个回答

批量插入啊, 一次1000条

executemany

首先,如楼上所说,executemany,批量插入。每次插入500-1000条,然后commit一下。
此外,有点疑惑:
1、原始日志10万条,解析之后,不应该是归并后入库么?那时数据量还有那么多?
2、如果每天需要往数据库插入10万条数据,那么三个月就将近1000万了。而对于mysql来说,当数据量上千万之后,效率就比较低了。可以考虑别的存储方式了,比如:ElasticSearch。

追答:批量插入代码大概这样(没有实际运行)

    conn = ...
    cursor = ...
    with open('access.log', 'r') as f:
        c = 0
        data_list = []
        for line in f.readlines():
            # 解析日志,得到所需的字段(比如:时间、URL、IP)
            data_list.append(('2018-04-20 12:12:12', '/login/', '1.1.1.1'))
            c += 1
            if c % 1000 == 0:
                cursor.executemany('insert into access_table values(%s, %s, %s)', data_list)
                conn.commit()
                data_list = []
        if data_list:
            cursor.executemany('insert into access_table values(%s, %s, %s)', data_list)
            conn.commit()
    cursor.close()
    conn.close()

用multiprocessing.dummy.Pool试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题