diff --git a/migrate/sql/20230208224400-storage-optimize-idx.sql b/migrate/sql/20230208224400-storage-optimize-idx.sql index f2986554287c87b0ca6be11325845b5f6a14a0f5..aaa556b2aee6a1ebc1ea2f9ff5e1e171c5d53386 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 eebe9b34281dd8a3425e5b927514feb4135c3005..91a057cb88f0a5ff115c6d42fdc51b752a691419 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` }