Add additional indicies on event and review tables. Every events or timeline endpoint filters on event start time and camera, this should speed things up by avoiding a range scan on the table.

This commit is contained in:
Greg 2026-05-08 15:59:23 -07:00
parent 4ff7ab96dc
commit 48b1426891
2 changed files with 56 additions and 1 deletions

View File

@ -399,13 +399,31 @@ def events_explore(
label_counts = {}
explore_columns = (
Event.id,
Event.camera,
Event.label,
Event.sub_label,
Event.zones,
Event.start_time,
Event.end_time,
Event.has_clip,
Event.has_snapshot,
Event.plus_id,
Event.retain_indefinitely,
Event.top_score,
Event.false_positive,
Event.box,
Event.data,
)
def event_generator():
for label_obj in distinct_labels.iterator():
label = label_obj.label
# get most recent events for this label
label_events = (
Event.select()
Event.select(*explore_columns)
.where((Event.label == label) & (Event.camera << allowed_cameras))
.order_by(Event.start_time.desc())
.limit(limit)

View File

@ -0,0 +1,37 @@
"""Peewee migrations -- 036_add_perf_indexes.py.
Adds composite/single-column indexes to speed up the most common queries
issued by the web UI on initial page load:
- event(camera, start_time DESC): /events list filtered by camera + time range
- reviewsegment(camera, start_time DESC): /api/review filtered by camera + time range
- reviewsegment(end_time): supports the end_time > after half of /api/review's range
The existing event(label, start_time DESC) index from migration 027 already
covers /events/explore, so it is intentionally not duplicated here.
"""
import peewee as pw
SQL = pw.SQL
def migrate(migrator, database, fake=False, **kwargs):
migrator.sql(
'CREATE INDEX IF NOT EXISTS "event_camera_start_time" '
'ON "event" ("camera", "start_time" DESC)'
)
migrator.sql(
'CREATE INDEX IF NOT EXISTS "reviewsegment_camera_start_time" '
'ON "reviewsegment" ("camera", "start_time" DESC)'
)
migrator.sql(
'CREATE INDEX IF NOT EXISTS "reviewsegment_end_time" '
'ON "reviewsegment" ("end_time")'
)
def rollback(migrator, database, fake=False, **kwargs):
migrator.sql('DROP INDEX IF EXISTS "event_camera_start_time"')
migrator.sql('DROP INDEX IF EXISTS "reviewsegment_camera_start_time"')
migrator.sql('DROP INDEX IF EXISTS "reviewsegment_end_time"')