Ситуация
- Работа с Python 3.7.2
- Я прочитал преимущество таблицы MariaDB с 5M строками на сервере.
- У меня есть локальный текстовый файл с целыми числами 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 в текстовом файле в будущем вырастет до 10-100 тысяч.
Я проконсультировался с другими ответами, включая это, но я не могу использовать из этого, так как я только прочитал previlege, поэтому невозможно создать другую таблицу для присоединения.
Итак, как я могу сделать выбор быстрее?
CREATE TEMPORARY TABLE
? - person danblack   schedule 27.02.2019JOIN
две таблицы, вероятно, решив проблему. Если нет, то у меня мало шансов? - person Ignatius   schedule 27.02.2019CREATE TEMPORARY TABLE
доступ. :-) - person danblack   schedule 27.02.2019