在Python中检查数百万个MySQL行

时间:2018-08-11 03:46:23

标签: python mysql python-3.x

我有一个Python程序,该程序下载一个具有超过1亿个唯一值的文本文件,并遵循以下逻辑:

  1. 如果表中已经存在该值,请更新条目的last_seen日期(SELECT id WHERE <col> = <value>;
  2. 如果表中不存在该值,则将该值插入表中

我排队需要添加的条目,然后在收集了几百个之后将它们插入到批量语句中。

当前,该程序需要24个小时以上才能运行。我在存储值的列上创建了一个索引。

我当前正在使用MySQLdb。

似乎价值存在的检验正在占据运行时的最大份额。我可以寻求哪些途径来加快速度?

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以尝试将值加载到集合中,这样就可以进行查找而无需每次都从数据库中获取数据。假定该表未被其他任何人更新,并且您有足够的内存。

# Let's assume you have a function runquery, that executes the 
# provided statement and returns a collection of values as strings.

existing_values = set(runquery('SELECT DISTINCT value FROM table'))

with open('big_file.txt') as f:
    inserts = []
    updates = []
    for line in f:
        value = line.strip()
        if value in existing_values:
            updates.append(value)
        else:
            existing_values.add(value)
            inserts.append(value)
        if len(inserts) > THRESHOLD or len(updates) > THRESHOLD:
            # Do bulk updates and clear inserts and updates