Большое спасибо @Strawberry и @Solarflare за помощь, предоставленную в комментариях.
Следующее решение позволило увеличить производительность более чем в 70 раз, поэтому я оставляю то, что сделал, в качестве ответа для полноты картины.
Я использовал индексы и опрашивал всю таблицу, как они и предлагали.
import sqlite3
from operators import attrgetter
connection = sqlite3.connect("database.db")
# Creating index, thanks to @Solarflare
cursor = connection.cursor()
cursor.execute("CREATE INDEX IF NOT EXISTS idx_user_id ON EVENT_LOG (user_id)")
cursor.commit()
# Reading the whole table, then make lists by user_id. Thanks to @Strawberry
cursor.execute("SELECT user_id, action, timestamp FROM EVENT_LOG ORDER BY user_id ASC")
previous_user_id = None
log_per_user = list()
classified_log = dict()
for row in cursor:
user_id, action, timestamp = row
if user_id != previous_user_id:
if previous_user_id:
log_per_user.sort(key=itemgetter(1))
classified_log[previous_user_id] = log_per_user[:]
log_per_user = list()
log_per_user.append((action, timestamp))
previous_user_id = user_id
Таким образом, точки
user_id
, чтобы ORDER BY user_id ASC
выполнялось в приемлемое время. user_id
, вместо того, чтобы делать отдельные запросы для каждого user_id
. cursor
для чтения строка за строкой вместо cursor.fetchall()
.