perf(backend): search stays in tens of milliseconds at archive size for rare words, channels, deleted and transcripts

This commit is contained in:
hh committed 2026-10-19 03:41:49 +00:00
1 parent 9a6bd8a714
commit e5a5edcaae
2 files changed
+50 -31

No files matched your search

@@ -1,7 +1,7 @@
"""message search index outside the hypertable, versions searchable
Revision ID: d8f1a6c3e5b7
Revises: c9e2a7f4b1d8
Revises: c5e7a9b1d3f6
Create Date: 2026-10-19 03:00:00.000000
"""
@@ -11,7 +11,7 @@ from collections.abc import Sequence
from alembic import op
revision: str = "d8f1a6c3e5b7"
down_revision: str | None = "c9e2a7f4b1d8"
down_revision: str | None = "c5e7a9b1d3f6"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
@@ -95,6 +95,13 @@ def upgrade() -> None:
"CREATE INDEX ix_message_search_sender ON message_search "
"(account_id, sender_id, date DESC)"
)
for flag in ("deleted", "edited"):
op.execute(
f"CREATE INDEX ix_message_search_{flag} ON message_search "
"(account_id, date DESC, chat_id DESC, message_id DESC) "
f"WHERE {flag}_at IS NOT NULL"
)
op.execute("ALTER TABLE message_search ALTER COLUMN tsv SET STATISTICS 1000")
op.execute(_SYNC)
op.execute(
"CREATE TRIGGER messages_search_insert AFTER INSERT ON messages "
@@ -117,6 +124,9 @@ def upgrade() -> None:
"CREATE INDEX ix_media_tsv ON media USING gin (search_vector(extracted_text))"
)
op.execute("DROP INDEX IF EXISTS ix_messages_tsv")
for index in ("ix_message_versions_tsv", "ix_media_tsv"):
op.execute(f"ALTER INDEX {index} ALTER COLUMN 1 SET STATISTICS 1000")
op.execute("ANALYZE message_search, message_versions, media")
def downgrade() -> None: