From f8b39eed1915798a18ba8d0149c5737a0305773d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 17 Apr 2026 07:59:13 +0000 Subject: [PATCH] perf: add index on memory.user_id Memory queries filter by user_id (get_memories_by_user_id, delete_memories_by_user_id) but the column had no index, forcing a full table scan per request. Adds a btree index via Alembic migration plus index=True on the model so fresh installs include it. --- .../a749ab2aa953_add_memory_user_id_index.py | 26 +++++++++++++++++++ backend/open_webui/models/memories.py | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 backend/open_webui/migrations/versions/a749ab2aa953_add_memory_user_id_index.py diff --git a/backend/open_webui/migrations/versions/a749ab2aa953_add_memory_user_id_index.py b/backend/open_webui/migrations/versions/a749ab2aa953_add_memory_user_id_index.py new file mode 100644 index 0000000000..6a54d8d27b --- /dev/null +++ b/backend/open_webui/migrations/versions/a749ab2aa953_add_memory_user_id_index.py @@ -0,0 +1,26 @@ +"""Add index on memory.user_id + +Revision ID: a749ab2aa953 +Revises: c1d2e3f4a5b6 +Create Date: 2026-04-17 00:00:00.000000 + +""" + +from alembic import op +import sqlalchemy as sa + +revision = 'a749ab2aa953' +down_revision = 'c1d2e3f4a5b6' +branch_labels = None +depends_on = None + + +def upgrade(): + # Memory.user_id is filtered on every per-user query + # (get_memories_by_user_id, delete_memories_by_user_id), + # so a btree index prevents full-table scans as the table grows. + op.create_index('memory_user_id_idx', 'memory', ['user_id']) + + +def downgrade(): + op.drop_index('memory_user_id_idx', table_name='memory') diff --git a/backend/open_webui/models/memories.py b/backend/open_webui/models/memories.py index e956826800..1ec52eeb6a 100644 --- a/backend/open_webui/models/memories.py +++ b/backend/open_webui/models/memories.py @@ -19,7 +19,7 @@ class Memory(Base): __tablename__ = 'memory' id = Column(String, primary_key=True, unique=True) - user_id = Column(String) + user_id = Column(String, index=True) content = Column(Text) updated_at = Column(BigInteger) created_at = Column(BigInteger)