Ситуация
- Работа с Python 3.7.2
- Я прочитал превалирование таблицы MariaDB с 5М строк на сервере.
- У меня есть локальныйтекстовый файл с 7K целыми числами, по одному в строке.
- Целые числа представляют IDX таблицы.
- Столбец IDX таблицы является первичным ключом.(поэтому я предполагаю, что он автоматически индексируется?)
Задача
Мне нужно выбрать все строки, IDX которых находится в текстовом файле.
Мои усилия
Версия 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
Версия 2
Выберите всю таблицу, выполните итерации курсора и строки выбора вишни.Цикл for .fetchall_unbuffered()
охватывает 30-40 тыс. Строк в секунду, а весь сценарий занимает около 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 , но не могу его использовать, посколькуЯ только прочитал previlege, поэтому невозможно создать другую таблицу для объединения.
Так как я могу сделать выбор быстрее?