From 4a8f7065c340a060381ab2b0e9514ee7d318504c Mon Sep 17 00:00:00 2001 From: Maxim Ivanov Date: Thu, 9 Feb 2023 10:51:04 +0000 Subject: [PATCH] Rearrange queries so that only one unique index is required --- migrate/sql/20230208224400-storage-optimize-idx.sql | 11 +++++++++-- server/core_storage.go | 9 ++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/migrate/sql/20230208224400-storage-optimize-idx.sql b/migrate/sql/20230208224400-storage-optimize-idx.sql index f29865542..aaa556b2a 100644 --- a/migrate/sql/20230208224400-storage-optimize-idx.sql +++ b/migrate/sql/20230208224400-storage-optimize-idx.sql @@ -1,6 +1,13 @@ +CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS storage_collection_user_id_key_idx ON storage (collection, user_id, key); + +--TODO: wait for index to complete + ALTER TABLE storage - drop constraint storage_pkey, add primary key using index "storage_collection_key_user_id_key"; + drop constraint storage_pkey, add primary key using index "storage_collection_user_id_key_idx"; DROP INDEX storage_pkey RESTRICT; +DROP INDEX storage_collection_key_user_id_key RESTRICT; +DROP INDEX collection_read_user_id_key_idx RESTRICT; +DROP INDEX collection_user_id_read_key_idx RESTRICT; + -CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS collection_user_id_key_idx ON storage (collection, user_id, key); diff --git a/server/core_storage.go b/server/core_storage.go index eebe9b342..91a057cb8 100644 --- a/server/core_storage.go +++ b/server/core_storage.go @@ -151,9 +151,8 @@ func StorageListObjectsAll(ctx context.Context, logger *zap.Logger, db *sql.DB, cursorQuery := "" params := []interface{}{collection, limit + 1} if storageCursor != nil { - //TODO: check if we can reorder collection,user_id, key - cursorQuery = ` AND (collection, key, user_id) > ($1, $3, $4) ` - params = append(params, storageCursor.Key, storageCursor.UserID) + cursorQuery = ` AND (collection, user_id, key) > ($1, $3, $4) ` + params = append(params, storageCursor.UserID, storageCursor.Key) } var query string @@ -162,14 +161,14 @@ func StorageListObjectsAll(ctx context.Context, logger *zap.Logger, db *sql.DB, SELECT collection, key, user_id, value, version, read, write, create_time, update_time FROM storage WHERE collection = $1` + cursorQuery + ` -ORDER BY key ASC, user_id ASC +ORDER BY user_id ASC, key ASC LIMIT $2` } else { query = ` SELECT collection, key, user_id, value, version, read, write, create_time, update_time FROM storage WHERE collection = $1 AND read >= 2` + cursorQuery + ` -ORDER BY key ASC, user_id ASC +ORDER BY user_id ASC, key ASC LIMIT $2` } -- GitLab