У меня есть таблица, которая выглядит следующим образом:
id_a, id_b, statistic
Эта таблица содержит 1M ~ 1024 * 1024 записей, содержащих все комбинации id_a и id_b.Ранее я вычислял статистику (число с плавающей запятой) на основе id_a
и id_b
, и теперь хотел бы собрать список всех пар id_a
и id_b
, чтобы каждая из них имела наименьшую возможную статистику, но также эти id_a и id_bпоявляются только один раз в обоих столбцах.
Хороший результат будет выглядеть следующим образом:
[1,2, 0.0]
[5,3, 0.1]
[7,9, 0.3]
...
Как видите, каждое число в первом и втором столбцах появляется только один раз на обоих.Я не могу расширить этот набор, добавив [6,7, _] или [5,6, _]
Мое решение пока выглядит как последовательное расширение запроса SQL:
exclude_abs = []
while s < maxSize:
a, b, stat = selectBestSystem(exclude_abs)
exclude_abs.extend([a,b])
def selectBestSystem(exclude_abs):
exclude_req = " AND ".join( map(lambda x: ("id_a!=%(1) and id_b!=%(1)" % x), exclude_abs) )
req = ("SELECT id_a, id_b, statistic FROM table WHERE"+ \
exclude_req+" ORDER BY statistic ASC LIMIT 1"
return db.process(req)
Thisсоздает запрос, который выглядит ужасающим после первых 100 извлеченных пар:
SELECT id_a, id_b, statistic FROM table WHERE
id_a!=1 and id_b!=1 and
id_a!=2 and id_b!=2 and
id_a!=5 and id_b!=5 and
id_a!=3 and id_b!=3 and
id_a!=7 and id_b!=7 and
id_a!=9 and id_b!=9 and
[...skipped 200 conditions...]
ORDER BY statistic ASC LIMIT 1
В результате на обработку этого запроса после 100+ выбранных пар уходит более 15 секунд.Есть ли лучший способ сделать этот последовательный процесс исключения на MySQL?Может быть, моя структура данных - полный мусор, и мне не следует использовать реляционные БД для начала?
БД - это AWS RDS Aurora 5.6.10a