我需要选择IDX在文本文件中的所有行。
进行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
选择整个表格,迭代光标和樱桃选择行。 .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,但我无法使用它,因为我只读了优先,因此不可能创建另一个表加入。
那么如何更快地进行选择呢?
临时表实现如下所示:
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")
感谢来自@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行。
离开这里作为答案只是为了完整性和未来的读者。