summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2024-01-22 15:39:41 +0000
committerErik Johnston <erik@matrix.org>2024-01-22 17:25:21 +0000
commit9302d20247c72fa322a51483f6842ec06ad1ac59 (patch)
tree9ffabec1dac8f8ece5122a0c19bb7ca41192059d
parentMerge remote-tracking branch 'origin/develop' into matrix-org-hotfixes (diff)
downloadsynapse-9302d20247c72fa322a51483f6842ec06ad1ac59.tar.xz
Speed up e2e device keys queries for bot accounts
-rw-r--r--synapse/storage/databases/main/end_to_end_keys.py29
1 files changed, 18 insertions, 11 deletions
diff --git a/synapse/storage/databases/main/end_to_end_keys.py b/synapse/storage/databases/main/end_to_end_keys.py

index 4e3171ce6c..96ec140bf4 100644 --- a/synapse/storage/databases/main/end_to_end_keys.py +++ b/synapse/storage/databases/main/end_to_end_keys.py
@@ -406,17 +406,24 @@ class EndToEndKeyWorkerStore(EndToEndKeyBackgroundStore, CacheInvalidationWorker def get_e2e_device_keys_txn( txn: LoggingTransaction, query_clause: str, query_params: list ) -> None: - sql = ( - "SELECT user_id, device_id, " - " d.display_name, " - " k.key_json" - " FROM devices d" - " %s JOIN e2e_device_keys_json k USING (user_id, device_id)" - " WHERE %s AND NOT d.hidden" - ) % ( - "LEFT" if include_all_devices else "INNER", - query_clause, - ) + if include_all_devices: + sql = f""" + SELECT user_id, device_id, d.display_name, k.key_json + FROM devices d + LEFT JOIN e2e_device_keys_json k USING (user_id, device_id) + WHERE {query_clause} AND NOT d.hidden + """ + else: + # We swap around `e2e_device_keys_json` and `devices`, as we + # want Postgres to query `e2e_device_keys_json` first as it will + # have fewer rows in it. This helps *a lot* with accounts with + # lots of non-e2e devices (such as bots). + sql = f""" + SELECT user_id, device_id, d.display_name, k.key_json + FROM e2e_device_keys_json k + INNER JOIN devices d USING (user_id, device_id) + WHERE {query_clause} AND NOT d.hidden + """ txn.execute(sql, query_params)