使数千个SELECT查询更快

问题描述 投票:0回答:2

情况

  • 使用Python 3.7.2
  • 我已经读取了服务器上有5M行的MariaDB表的权限。
  • 我有一个7K整数的本地文本文件,每行一个。
  • 整数表示表的IDX。
  • 表的IDX列是主键。 (所以我想它会自动编入索引?)

问题

我需要选择IDX在文本文件中的所有行。

我的努力

Version 1

进行7K查询,对文本文件中的每一行进行一次查询。这使得每秒大约130个查询,花费大约1分钟来完成。

import pymysql
connection = pymysql.connect(....)
with connection.cursor() as cursor:
    query = (
        "SELECT *"
        " FROM TABLE1"
        " WHERE IDX = %(idx)s;"
    )

    all_selected = {}
    with open("idx_list.txt", "r") as f:
        for idx in f:
            idx = idx.strip()
            if idx:
                idx = int(idx)
                parameters = {"idx": idx}
                cursor.execute(query, parameters)
                result = cursor.fetchall()[0]
                all_selected[idx] = result

Version 2

选择整个表格,迭代光标和樱桃选择行。 .fetchall_unbuffered()上的for循环覆盖每秒30-40K行,整个脚本大约需要3分钟才能完成。

import pymysql
connection = pymysql.connect(....)
with connection.cursor() as cursor:
    query = "SELECT * FROM TABLE1"

    set_of_idx = set()
    with open("idx_list.txt", "r") as f:
        for line in f:
            if line.strip():
                line = int(line.strip())
                set_of_idx.add(line)


    all_selected = {}
    cursor.execute(query)
    for row in cursor.fetchall_unbuffered():
        if row[0] in set_of_idx:
            all_selected[row[0]] = row[1:]

预期的行为

我需要选择更快,因为文本文件中的IDX数量将来会增长到10K-100K。

我咨询了其他答案,包括this,但我无法使用它,因为我只读了优先,因此不可能创建另一个表加入。

那么如何更快地进行选择呢?

mysql mariadb pymysql
2个回答
2
投票

临时表实现如下所示:

connection = pymysql.connect(....,local_infile=True)
with connection.cursor() as cursor:
    cursor.execute("CREATE TEMPORARY TABLE R (IDX INT PRIMARY KEY)")
    cursor.execute("LOAD DATA LOCAL INFILE 'idx_list.txt' INTO R")
    cursor.execute("SELECT TABLE1.* FROM TABLE1 JOIN R USING IDX")
    ..
    cursor.execute("DROP TEMPORARY TABLE R")

0
投票

感谢来自@danblack的提示(或提示),我能够通过以下查询获得所需的结果。

query = (
    "SELECT *"
    " FROM TABLE1"
    " INNER JOIN R"
    " ON R.IDX = TABLE1.IDX;"
)
cursor.execute(query)

danblack的SELECT声明对我不起作用,引发了一个错误:

pymysql.err.ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的MariaDB服务器版本对应的手册,以便在第1行的'IDX'附近使用正确的语法”)

这可能是因为MariaDB的连接语法,所以我咨询了MariaDB documentation on joining tables

现在它在0.9秒内选择7K行。

离开这里作为答案只是为了完整性和未来的读者。

© www.soinside.com 2019 - 2024. All rights reserved.