Эффективная классификация БД журналов событий по столбцу

0
задан Taegyung 4 March 2019 в 08:09
поделиться

1 ответ

Большое спасибо @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().
0
ответ дан Taegyung 4 March 2019 в 08:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: