{"id":28508830,"url":"https://github.com/surrealdb/crud-bench","last_synced_at":"2025-08-24T01:09:24.567Z","repository":{"id":277154085,"uuid":"864100468","full_name":"surrealdb/crud-bench","owner":"surrealdb","description":"A benchmarking tool for testing and comparing the performance of both embedded and networked SQL and NoSQL databases.","archived":false,"fork":false,"pushed_at":"2025-06-13T09:35:37.000Z","size":1157,"stargazers_count":24,"open_issues_count":6,"forks_count":6,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-06-30T07:19:05.376Z","etag":null,"topics":["benchmark","benchmarking","database","performance","performance-testing","surreal","surrealdb"],"latest_commit_sha":null,"homepage":"https://surrealdb.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/surrealdb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-27T13:47:38.000Z","updated_at":"2025-06-23T06:30:25.000Z","dependencies_parsed_at":"2025-02-12T12:52:37.268Z","dependency_job_id":"e1810ae1-fae2-4c87-bccf-9f3609b0c168","html_url":"https://github.com/surrealdb/crud-bench","commit_stats":null,"previous_names":["surrealdb/crud-bench"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/surrealdb/crud-bench","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surrealdb%2Fcrud-bench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surrealdb%2Fcrud-bench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surrealdb%2Fcrud-bench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surrealdb%2Fcrud-bench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/surrealdb","download_url":"https://codeload.github.com/surrealdb/crud-bench/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surrealdb%2Fcrud-bench/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263226128,"owners_count":23433642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["benchmark","benchmarking","database","performance","performance-testing","surreal","surrealdb"],"created_at":"2025-06-08T21:39:52.673Z","updated_at":"2025-07-02T22:32:09.352Z","avatar_url":"https://github.com/surrealdb.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg width=\"100%\" src=\"./img/hero.png\" alt=\"CRUD-bench hero\"\u003e\n\n# crud-bench\n\nThe crud-bench benchmarking tool is an open-source benchmarking tool for testing and comparing the performance of a\nnumber of different workloads on embedded, networked, and remote databases. It can be used to compare both SQL and NoSQL\nplatforms including key-value, embedded, relational, document, and multi-model databases. Importantly crud-bench focuses\non testing additional features which are not present in other benchmarking tools, but which are available in SurrealDB.\n\nThe primary purpose of crud-bench is to continually test and monitor the performance of features and functionality built\nin to SurrealDB, enabling developers working on features in SurrealDB to assess the impact of their changes on database\nqueries and performance.\n\nThe crud-bench benchmarking tool is being actively developed with new features and functionality being added regularly.\n\n## Contributing\n\nThe crud-bench benchmarking tool is open-source, and we encourage additions, modifications, and improvements to the\nbenchmark runtime, and the datastore implementations.\n\n## How does it work?\n\nWhen running simple, automated tests, the crud-bench benchmarking tool will automatically start a Docker container for\nthe datastore or database which is being benchmarked (when the datastore or database is networked). This configuration\ncan be modified so that an optimised, remote environment can be connected to, instead of running a Docker container\nlocally. This allows for running crud-bench against remote datastores, and distributed datastores on a local network\nor remotely in the cloud.\n\nIn one table, the benchmark will operate 5 main tasks:\n\n- Create: inserting N unique records, with the specified concurrency.\n- Read: read N unique records, with the specified concurrency.\n- Update: update N unique records, with the specified concurrency.\n- Scans: perform a number of range and table scans, with the specified concurrency.\n- Delete: delete N unique records, with the specified concurrency.\n\nWith crud-bench almost all aspects of the benchmark engine are configurable:\n\n- The number of rows or records (samples).\n- The number of concurrent clients or connections.\n- The number of concurrent threads (concurrent messages per client).\n- Whether rows or records are modified sequentially or randomly.\n- The primary id or key type for the records.\n- The row or record content including support for nested objects and arrays.\n- The scan specifications for range or table queries.\n\n## Benchmarks\n\nAs crud-bench is in active development, some benchmarking workloads are already implemented, while others will be\nimplemented in future releases. The list below details which benchmarks are implemented for the supporting datastores\nand lists those which are planned in the future.\n\n**CRUD**\n\n- [x] Creating single records in individual transactions\n- [x] Reading single records in individual transactions\n- [x] Updating single records in individual transactions\n- [x] Deleting single records in individual transactions\n- [ ] Batch creating multiple records in a transaction\n- [ ] Batch reading multiple records in a transactions\n- [ ] Batch updating multiple records in a transactions\n- [ ] Batch deleting multiple records in a transactions\n\n**Scans**\n\n- [x] Full table scans, projecting all fields\n- [x] Full table scans, projecting id field\n- [x] Full table count queries\n- [x] Scans with a limit, projecting all fields\n- [x] Scans with a limit, projecting id field\n- [x] Scans with a limit, counting results\n- [x] Scans with a limit and offset, projecting all fields\n- [x] Scans with a limit and offset, projecting id field\n- [x] Scans with a limit and offset, counting results\n\n**Filters**\n\n- [ ] Full table query, using filter condition, projecting all fields\n- [ ] Full table query, using filter condition, projecting id field\n- [ ] Full table query, using filter condition, counting rows\n\n**Indexes**\n\n- [ ] Indexed table query, using filter condition, projecting all fields\n- [ ] Indexed table query, using filter condition, projecting id field\n- [ ] Indexed table query, using filter condition, counting rows\n\n**Relationships**\n\n- [ ] Fetching or traversing 1-level, one-to-one relationships or joins\n- [ ] Fetching or traversing 1-level, one-to-many relationships or joins\n- [ ] Fetching or traversing 1-level, many-to-many relationships or joins\n- [ ] Fetching or traversing n-level, one-to-one relationships or joins\n- [ ] Fetching or traversing n-level, one-to-many relationships or joins\n- [ ] Fetching or traversing n-level, many-to-many relationships or joins\n\n**Workloads**\n\n- [ ] Workload support for creating, updating, and reading records concurrently\n\n## Requirements\n\n- [Docker](https://www.docker.com/) - required when running automated tests\n- [Rust](https://www.rust-lang.org/) - required when building crud-bench from source\n- [Cargo](https://github.com/rust-lang/cargo) - required when building crud-bench from source\n\n## Usage\n\n```bash\ncargo run -r -- -h\n```\n\n```bash\nUsage: crud-bench [OPTIONS] --database \u003cDATABASE\u003e --samples \u003cSAMPLES\u003e\n\nOptions:\n  -n, --name \u003cNAME\u003e          An optional name for the test, used as a suffix for the JSON result file name\n  -d, --database \u003cDATABASE\u003e  The database to benchmark [possible values: dry, map, arangodb, dragonfly, fjall, keydb, lmdb, mongodb, mysql, neo4j, postgres, redb, redis, rocksdb, scylladb, sqlite, surrealkv, surrealdb, surrealdb-memory, surrealdb-rocksdb, surrealdb-surrealkv]\n  -i, --image \u003cIMAGE\u003e        Specify a custom Docker image\n  -p, --privileged           Whether to run Docker in privileged mode\n  -e, --endpoint \u003cENDPOINT\u003e  Specify a custom endpoint to connect to\n  -b, --blocking \u003cBLOCKING\u003e  Maximum number of blocking threads (default is the number of CPU cores) [default: 12]\n  -w, --workers \u003cWORKERS\u003e    Number of async runtime workers (default is the number of CPU cores) [default: 12]\n  -c, --clients \u003cCLIENTS\u003e    Number of concurrent clients [default: 1]\n  -t, --threads \u003cTHREADS\u003e    Number of concurrent threads per client [default: 1]\n  -s, --samples \u003cSAMPLES\u003e    Number of samples to be created, read, updated, and deleted\n  -r, --random               Generate the keys in a pseudo-randomized order\n  -k, --key \u003cKEY\u003e            The type of the key [default: integer] [possible values: integer, string26, string90, string250, string506, uuid]\n  -v, --value \u003cVALUE\u003e        Size of the text value [env: CRUD_BENCH_VALUE=] [default: \"{\\n\\t\\t\\t\\\"text\\\": \\\"string:50\\\",\\n\\t\\t\\t\\\"integer\\\": \\\"int\\\"\\n\\t\\t}\"]\n      --show-sample          Print-out an example of a generated value\n      --pid \u003cPID\u003e            Collect system information for a given pid\n  -a, --scans \u003cSCANS\u003e        An array of scan specifications [env: CRUD_BENCH_SCANS=] [default: \"[\\n\\t\\t\\t{ \\\"name\\\": \\\"count_all\\\", \\\"samples\\\": 100, \\\"projection\\\": \\\"COUNT\\\" },\\n\\t\\t\\t{ \\\"name\\\": \\\"limit_id\\\", \\\"samples\\\": 100, \\\"projection\\\": \\\"ID\\\", \\\"limit\\\": 100, \\\"expect\\\": 100 },\\n\\t\\t\\t{ \\\"name\\\": \\\"limit_all\\\", \\\"samples\\\": 100, \\\"projection\\\": \\\"FULL\\\", \\\"limit\\\": 100, \\\"expect\\\": 100 },\\n\\t\\t\\t{ \\\"name\\\": \\\"limit_count\\\", \\\"samples\\\": 100, \\\"projection\\\": \\\"COUNT\\\", \\\"limit\\\": 100, \\\"expect\\\": 100 },\\n\\t\\t\\t{ \\\"name\\\": \\\"limit_start_id\\\", \\\"samples\\\": 100, \\\"projection\\\": \\\"ID\\\", \\\"start\\\": 5000, \\\"limit\\\": 100, \\\"expect\\\": 100 },\\n\\t\\t\\t{ \\\"name\\\": \\\"limit_start_all\\\", \\\"samples\\\": 100, \\\"projection\\\": \\\"FULL\\\", \\\"start\\\": 5000, \\\"limit\\\": 100, \\\"expect\\\": 100 },\\n\\t\\t\\t{ \\\"name\\\": \\\"limit_start_count\\\", \\\"samples\\\": 100, \\\"projection\\\": \\\"COUNT\\\", \\\"start\\\": 5000, \\\"limit\\\": 100, \\\"expect\\\": 100 }\\n\\t\\t]\"]\n  -h, --help                 Print help (see more with '--help')```\n\nFor more detailed help information run the following command:\n\n```bash\ncargo run -r -- --help\n```\n\n### Value\n\nYou can use the argument `-v` or `--value` (or the environment variable `CRUD_BENCH_VALUE`) to customize the row,\ndocument, or record value which should be used in the benchmark tests. Pass a JSON structure that will serve as a\ntemplate for generating a randomized value.\n\n\u003e [!NOTE]\n\u003e For tabular, or column-oriented databases (e.g. Postgres, MySQL, ScyllaDB), the first-level fields of the JSON\n\u003e structure are translated as columns, and any nested structures will be stored in a JSON column where possible.\n\nWithin the JSON structure, the following values are replaced by randomly generated data:\n\n- Every occurrence of `string:XX` will be replaced by a random string with XX characters.\n- Every occurrence of `text:XX` will be replaced by a random string made of words of 2 to 10 characters, for a total of\n  XX characters.\n- Every occurrence of `string:X..Y` will be replaced by a random string between X and Y characters.\n- Every occurrence of `text:X..Y` will be replaced by a random string made of words of 2 to 10 characters, for a total\n  between X and Y characters.\n- Every `int` will be replaced by a random integer (i32).\n- Every `int:X..Y` will be replaced by a random integer (i32) between X and Y.\n- Every `float` will be replaced by a random float (f32).\n- Every `float:X..Y` will be replaced by a random float (f32) between X and Y.\n- Every `uuid` will be replaced by a random UUID (v4).\n- Every `bool` will be replaced by a `true` or `false` (v4).\n- Every `string_enum:A,B,C` will be replaced by a string from `A` `B` or `C`.\n- Every `int_enum:A,B,C` will be replaced by a i32 from  `A` `B` or `C`.\n- Every `float_enum:A,B,C` will be replaced by a f32 from  `A` `B` or `C`.\n- Every `datetime` will be replaced by a datetime (ISO 8601).\n\n```json\n{\n  \"text\": \"text:30\",\n  \"text_range\": \"text:10..50\",\n  \"bool\": \"bool\",\n  \"string_enum\": \"enum:foo,bar\",\n  \"datetime\": \"datetime\",\n  \"float\": \"float\",\n  \"float_range\": \"float:1..10\",\n  \"float_enum\": \"float:1.1,2.2,3.3\",\n  \"integer\": \"int\",\n  \"integer_range\": \"int:1..5\",\n  \"integer_enum\": \"int:1,2,3\",\n  \"uuid\": \"uuid\",\n  \"nested\": {\n    \"text\": \"text:100\",\n    \"array\": [\n      \"string:10\",\n      \"string:2..5\"\n    ]\n  }\n}\n```\n\n### Scans\n\nYou can use the argument `-a` or `--scans` (or the environment variable `CRUD_BENCH_SCANS`) to customise the range,\ntable, or scan queries that are performed in the benchmark. This parameter accepts a JSON array, where each item\nrepresents a different scan test. Each test is defined as a JSON object specifying the scan parameters and the test\nname.\n\n\u003e [!NOTE]\n\u003e Not every database benchmark adapter supports scans or range queries. In such cases, the benchmark will not fail but\n\u003e the associated tests will indicate that the benchmark was `skipped`.\n\nEach scan object can make use of the following values:\n\n- `name`: A descriptive name for the test.\n- `projection`: The projection type of the scan:\n    - `\"ID\"`: only the ID is returned.\n    - `\"FULL\"`: the whole record is returned.\n    - `\"COUNT\"`: count the number of records.\n- `start`: Skips the specified number of rows before starting to return rows.\n- `limit`: Specifies the maximum number of rows to return.\n- `expect`: (optional) Asserts the expected number of rows returned.\n\n```json\n[\n  {\n    \"name\": \"limit100\",\n    \"projection\": \"FULL\",\n    \"start\": 0,\n    \"limit\": 100,\n    \"expect\": 100\n  },\n  {\n    \"name\": \"start100\",\n    \"projection\": \"ID\",\n    \"start\": 100,\n    \"limit\": 100,\n    \"expect\": 100\n  }\n]\n```\n\n## Databases\n\n### Dry\n\nThis benchmark does not interact with any datastore, allowing the overhead of the benchmark implementation, written in\nRust, to be measured.\n\n```bash\ncargo run -r -- -d dry -s 100000 -c 12 -t 24 -r\n```\n\n### [ArangoDB](https://arangodb.com/)\n\nArangoDB is a multi-model database with flexible data modeling and efficient querying.\n\n```bash\ncargo run -r -- -d arangodb -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running ArangoDB instance use the following command:\n\n```bash\ncargo run -r -- -d arangodb -e http://127.0.0.1:8529 -s 100000 -c 12 -t 24 -r\n```\n\n### [Dragonfly](https://www.dragonflydb.io/)\n\nDragonfly is an in-memory, networked, datastore which is fully-compatible with Redis and Memcached APIs.\n\n```bash\ncargo run -r -- -d dragonfly -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running Dragonfly instance use the\nfollowing command:\n\n```bash\ncargo run -r -- -d dragonfly -e redis://:root@127.0.0.1:6379 -s 100000 -c 12 -t 24 -r\n```\n\n### [Fjall](https://fjall-rs.github.io/)\n\nFjall is a transactional, ACID-compliant, embedded, key-value datastore, written in safe Rust, and based on LSM-trees.\n\n```bash\ncargo run -r -- -d fjall -s 100000 -c 12 -t 24 -r\n```\n\n### [KeyDB](https://docs.keydb.dev/)\n\nKeyDB is an in-memory, networked, datastore which is a high-performance fork of Redis, with a focus on multithreading.\n\n```bash\ncargo run -r -- -d keydb -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running KeyDB instance use the\nfollowing command:\n\n```bash\ncargo run -r -- -d keydb -e redis://:root@127.0.0.1:6379 -s 100000 -c 12 -t 24 -r\n```\n\n### [LMDB](http://www.lmdb.tech/doc/)\n\nLMDB is a transactional, ACID-compliant, embedded, key-value datastore, based on B-trees.\n\n```bash\ncargo run -r -- -d lmdb -s 100000 -c 12 -t 24 -r\n```\n\n### [Map](https://github.com/xacrimon/dashmap)\n\nAn in-memory concurrent, associative HashMap in Rust.\n\n```bash\ncargo run -r -- -d map -s 100000 -c 12 -t 24 -r\n```\n\n### [MongoDB](https://www.mongodb.com/)\n\nMongoDB is a NoSQL, networked, ACID-compliant, document-oriented database, with support for unstructured data storage.\n\n```bash\ncargo run -r -- -d mongodb -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running MongoDB instance use the\nfollowing command:\n\n```bash\ncargo run -r -- -d mongodb -e mongodb://root:root@127.0.0.1:27017 -s 100000 -c 12 -t 24 -r\n```\n\n### [MySQL](https://www.mysql.com/)\n\nMySQL is a networked, relational, ACID-compliant, SQL-based database.\n\n```bash\ncargo run -r -- -d mysql -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running MySQL instance use the\nfollowing command:\n\n```bash\ncargo run -r -- -d mysql -e mysql://root:mysql@127.0.0.1:3306/bench -s 100000 -c 12 -t 24 -r\n```\n\n### [Neo4j](https://neo4j.com/)\n\nNeo4j is a graph database management system for connected data.\n\n```bash\ncargo run -r -- -d neo4j -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running Neo4j instance use the\nfollowing command:\n\n```bash\ncargo run -r -- -d neo4j -e '127.0.0.1:7687' -s 100000 -c 12 -t 24 -r\n```\n\n### [Postgres](https://www.postgresql.org/)\n\nPostgres is a networked, object-relational, ACID-compliant, SQL-based database.\n\n```bash\ncargo run -r -- -d postgres -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running Postgres instance use the\nfollowing command:\n\n```bash\ncargo run -r -- -d postgres -e 'host=127.0.0.1 user=postgres password=postgres' -s 100000 -c 12 -t 24 -r\n```\n\n### [ReDB](https://www.redb.org/)\n\nReDB is a transactional, ACID-compliant, embedded, key-value datastore, written in Rust, and based on B-trees.\n\n```bash\ncargo run -r -- -d redb -s 100000 -c 12 -t 24 -r\n```\n\n### [Redis](https://redis.io/)\n\nRedis is an in-memory, networked, datastore that can be used as a cache, message broker, or datastore.\n\n```bash\ncargo run -r -- -d redis -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to an already-running Redis instance use the\nfollowing command:\n\n```bash\ncargo run -r -- -d redis -e redis://:root@127.0.0.1:6379 -s 100000 -c 12 -t 24 -r\n```\n\n### [RocksDB](https://rocksdb.org/)\n\nRocksDB is a transactional, ACID-compliant, embedded, key-value datastore, based on LSM-trees.\n\n```bash\ncargo run -r -- -d rocksdb -s 100000 -c 12 -t 24 -r\n```\n\n### [ScyllaDB](https://www.scylladb.com/)\n\nScyllaDB is a distributed, NoSQL, wide-column datastore, designed to be compatible with Cassandra.\n\n```bash\ncargo run -r -- -d scylladb -s 100000 -c 12 -t 24 -r\n```\n\nThe above command starts a Docker container automatically. To connect to a already-running ScyllaDB cluster use the\nfollowing command:\n\n```bash\ncargo run -r -- -d scylladb -e 127.0.0.1:9042 -s 100000 -c 12 -t 24 -r\n```\n\n### [SQLite](https://www.sqlite.org/)\n\nSQLite is an embedded, relational, ACID-compliant, SQL-based database.\n\n```bash\ncargo run -r -- -d sqlite -s 100000 -c 12 -t 24 -r\n```\n\n### [SurrealDB](https://surrealdb.com) (in-memory storage engine)\n\n```bash\ncargo run -r -- -d surrealdb-memory -s 100000 -c 12 -t 24 -r\n```\n\n### [SurrealDB](https://surrealdb.com) (RocksDB storage engine)\n\n```bash\ncargo run -r -- -d surrealdb-rocksdb -s 100000 -c 12 -t 24 -r\n```\n\n### [SurrealDB](https://surrealdb.com) (SurrealKV storage engine)\n\n```bash\ncargo run -r -- -d surrealdb-surrealkv -s 100000 -c 12 -t 24 -r\n```\n\n### [SurrealDB](https://surrealdb.com) embedded (in-memory storage engine)\n\n```bash\ncargo run -r -- -d surrealdb -e memory -s 100000 -c 12 -t 24 -r\n```\n\n### [SurrealDB](https://surrealdb.com) embedded (RocksDB storage engine)\n\n```bash\ncargo run -r -- -d surrealdb -e rocksdb:/tmp/db -s 100000 -c 12 -t 24 -r\n```\n\n### [SurrealDB](https://surrealdb.com) embedded (SurrealKV storage engine)\n\n```bash\ncargo run -r -- -d surrealdb -e surrealkv:/tmp/db -s 100000 -c 12 -t 24 -r\n```\n\n### [SurrealKV](https://surrealkv.org)\n\nSurrealKV is a transactional, ACID-compliant, embedded, key-value datastore, written in Rust, and based on concurrent\nadaptive radix trees.\n\n```bash\ncargo run -r -- -d surrealkv -s 100000 -c 12 -t 24 -r\n```\n\n## SurrealDB local benchmark\n\nTo run the benchmark against an already running SurrealDB instance, follow the steps below.\n\nStart a SurrealDB server:\n\n```bash\nsurreal start --allow-all -u root -p root rocksdb:/tmp/db\n```\n\nThen run crud-bench with the `surrealdb` database option:\n\n```bash\ncargo run -r -- -d surrealdb -e ws://127.0.0.1:8000 -s 100000 -c 12 -t 24 -r\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsurrealdb%2Fcrud-bench","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsurrealdb%2Fcrud-bench","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsurrealdb%2Fcrud-bench/lists"}