mirror of https://github.com/zulip/zulip.git
1 Commits
Author | SHA1 | Message | Date |
---|---|---|---|
Tim Abbott | 4d94d4d6f6 |
[schema] Add case-insensitive index on message subject field.
We need to run the schema migration manually using "CREATE INDEX CONCURRENTLY upper_subject_idx ON zerver_message ((upper(subject)));" since we need CONCURRENTLY and I seem to recall that doesn't work with South. Apparently our existing indexes on subject/topic weren't being used in our narrowing queries, because we do case-insensitive search. This substantially improves our database performance around stream+topic narrows. See before and after query plans below from my test instance. humbug=# explain analyze SELECT "zerver_message"."id" FROM "zerver_message" WHERE ("zerver_message"."recipient_id" = 38 AND UPPER(zerver_message.subject) = 'TEST' AND "zerver_message"."id" <= 348495 ) ORDER BY "zerver_message"."id" DESC LIMIT 50; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=13510.61..13510.71 rows=41 width=4) (actual time=32.952..32.958 rows=2 loops=1) -> Sort (cost=13510.61..13510.71 rows=41 width=4) (actual time=32.946..32.947 rows=2 loops=1) Sort Key: id Sort Method: quicksort Memory: 25kB -> Bitmap Heap Scan on zerver_message (cost=237.99..13509.51 rows=41 width=4) (actual time=2.357..32.912 rows=2 loops=1) Recheck Cond: (recipient_id = 38) Filter: ((id <= 348495) AND (upper((subject)::text) = 'TEST'::text)) -> Bitmap Index Scan on zephyr_message_recipient_id (cost=0.00..237.98 rows=8221 width=0) (actual time=1.178..1.178 rows=10354 loops=1) Index Cond: (recipient_id = 38) Total runtime: 33.049 ms (10 rows) humbug=# explain analyze SELECT "zerver_message"."id" FROM "zerver_message" WHERE ("zerver_message"."recipient_id" = 38 AND UPPER(zerver_message.subject) = 'TEST' AND "zerver_message"."id" <= 348495 ) ORDER BY "zerver_message"."id" DESC LIMIT 50; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=435.11..435.22 rows=41 width=4) (actual time=4.998..4.999 rows=2 loops=1) -> Sort (cost=435.11..435.22 rows=41 width=4) (actual time=4.997..4.997 rows=2 loops=1) Sort Key: id Sort Method: quicksort Memory: 25kB -> Bitmap Heap Scan on zerver_message (cost=275.63..434.02 rows=41 width=4) (actual time=4.981..4.984 rows=2 loops=1) Recheck Cond: ((upper((subject)::text) = 'TEST'::text) AND (recipient_id = 38)) Filter: (id <= 348495) -> BitmapAnd (cost=275.63..275.63 rows=41 width=0) (actual time=4.954..4.954 rows=0 loops=1) -> Bitmap Index Scan on upper_subject_idx (cost=0.00..37.38 rows=1744 width=0) (actual time=2.972..2.972 rows=27457 loops=1) Index Cond: (upper((subject)::text) = 'TEST'::text) -> Bitmap Index Scan on zephyr_message_recipient_id (cost=0.00..237.98 rows=8221 width=0) (actual time=0.855..0.855 rows=10354 loops=1) Index Cond: (recipient_id = 38) Total runtime: 5.049 ms (13 rows) (imported from commit 1f4815ccb0691053ff8d505149482dbc74153fb3) |