Sasha
e468292039
perf(db-mongodb): improve performance of all operations, up to 50% faster (#9594)
This PR improves speed and memory efficiency across all operations with
the Mongoose adapter.
### How?
- Removes Mongoose layer from all database calls, instead uses MongoDB
directly. (this doesn't remove building mongoose schema since it's still
needed for indexes + users in theory can use it)
- Replaces deep copying of read results using
`JSON.parse(JSON.stringify(data))` with the `transform` `operation:
'read'` function which converts Date's, ObjectID's in relationships /
joins to strings. As before, it also handles transformations for write
operations.
- Faster `hasNearConstraint` for potentially large `where`'s
- `traverseFields` now can accept `flattenedFields` which we use in
`transform`. Less recursive calls with tabs/rows/collapsible
Additional fixes
- Uses current transaction for querying nested relationships properties
in `buildQuery`, previously it wasn't used which could've led to wrong
results
- Allows to clear not required point fields with passing `null` from the
Local API. Previously it didn't work in both, MongoDB and Postgres
Benchmarks using this file
https://github.com/payloadcms/payload/blob/chore/db-benchmark/test/_community/int.spec.ts
### Small Dataset Performance
| Metric | Before Optimization | After Optimization | Improvement (%) |
|---------------------------|---------------------|--------------------|-----------------|
| Average FULL (ms) | 1170 | 844 | 27.86% |
| `payload.db.create` (ms) | 1413 | 691 | 51.12% |
| `payload.db.find` (ms) | 2856 | 2204 | 22.83% |
| `payload.db.deleteMany` (ms) | 15206 | 8439 | 44.53% |
| `payload.db.updateOne` (ms) | 21444 | 12162 | 43.30% |
| `payload.db.findOne` (ms) | 159 | 112 | 29.56% |
| `payload.db.deleteOne` (ms) | 3729 | 2578 | 30.89% |
| DB small FULL (ms) | 64473 | 46451 | 27.93% |
---
### Medium Dataset Performance
| Metric | Before Optimization | After Optimization | Improvement (%) |
|---------------------------|---------------------|--------------------|-----------------|
| Average FULL (ms) | 9407 | 6210 | 33.99% |
| `payload.db.create` (ms) | 10270 | 4321 | 57.93% |
| `payload.db.find` (ms) | 20814 | 16036 | 22.93% |
| `payload.db.deleteMany` (ms) | 126351 | 61789 | 51.11% |
| `payload.db.updateOne` (ms) | 201782 | 99943 | 50.49% |
| `payload.db.findOne` (ms) | 1081 | 817 | 24.43% |
| `payload.db.deleteOne` (ms) | 28534 | 23363 | 18.12% |
| DB medium FULL (ms) | 519518 | 342194 | 34.13% |
---
### Large Dataset Performance
| Metric | Before Optimization | After Optimization | Improvement (%) |
|---------------------------|---------------------|--------------------|-----------------|
| Average FULL (ms) | 26575 | 17509 | 34.14% |
| `payload.db.create` (ms) | 29085 | 12196 | 58.08% |
| `payload.db.find` (ms) | 58497 | 43838 | 25.04% |
| `payload.db.deleteMany` (ms) | 372195 | 173218 | 53.47% |
| `payload.db.updateOne` (ms) | 544089 | 288350 | 47.00% |
| `payload.db.findOne` (ms) | 3058 | 2197 | 28.14% |
| `payload.db.deleteOne` (ms) | 82444 | 64730 | 21.49% |
| DB large FULL (ms) | 1461097 | 969714 | 33.62% |
2024-12-19 13:20:39 -05:00
..
2024-12-06 13:30:04 -05:00
2024-12-11 08:43:22 -05:00
2024-12-18 22:44:46 +00:00
2024-11-27 20:36:37 +00:00
2024-11-16 15:30:05 -05:00
2024-11-27 20:36:37 +00:00
2024-12-16 17:22:17 +02:00
2024-11-26 14:31:14 -07:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-09-20 22:46:40 -04:00
2024-12-18 22:44:04 -05:00
2024-12-19 11:08:17 -05:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-12-19 13:20:39 -05:00
2024-12-19 13:20:39 -05:00
2024-11-27 20:36:37 +00:00
2024-12-13 15:03:57 -05:00
2024-12-16 17:22:17 +02:00
2024-12-19 11:08:17 -05:00
2024-12-17 12:08:40 -05:00
2024-11-27 20:36:37 +00:00
2024-10-30 17:56:50 +00:00
2024-12-19 13:20:39 -05:00
2024-11-27 20:36:37 +00:00
2024-12-09 11:54:20 -05:00
2024-08-13 12:54:33 -04:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-12-10 08:42:23 -05:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-12-13 12:04:07 -05:00
2024-11-27 20:36:37 +00:00
2024-11-29 21:25:26 +02:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-12-11 00:33:53 +00:00
2024-12-19 11:08:17 -05:00
2024-07-23 13:44:44 -04:00
2024-12-19 13:20:39 -05:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-11-27 20:36:37 +00:00
2024-12-16 21:40:22 +00:00
2024-12-07 16:38:25 +02:00
2024-11-27 20:36:37 +00:00
2024-12-04 17:01:09 -05:00
2024-07-11 15:59:38 -04:00
2024-05-25 15:45:05 +00:00
2024-10-18 05:38:48 +00:00
2023-09-01 14:45:41 -04:00
2024-03-07 11:33:46 -05:00
2024-11-11 13:59:05 -05:00
2024-09-20 22:46:40 -04:00
2024-12-18 22:44:04 -05:00
2024-12-19 11:08:17 -05:00
2024-08-13 12:54:33 -04:00
2024-11-11 19:28:55 -07:00
2024-09-16 17:02:08 +00:00
2024-11-26 14:31:14 -07:00
2024-09-16 17:02:08 +00:00
2024-11-11 13:59:05 -05:00
2024-10-11 18:54:39 +00:00
2024-12-19 18:20:28 +00:00
2024-10-11 18:54:39 +00:00
2024-12-17 14:49:29 -05:00
2024-11-11 13:59:05 -05:00
2024-12-13 11:31:24 -05:00
2024-05-01 17:35:41 -04:00
2024-11-11 13:59:05 -05:00
2024-11-11 13:59:05 -05:00
2024-08-14 08:57:04 -04:00
2024-08-14 08:57:04 -04:00
2024-10-14 20:02:26 +00:00
2024-10-24 21:19:15 -04:00
2024-04-06 15:06:04 -04:00
2024-06-17 14:25:36 -04:00
2024-12-17 14:49:29 -05:00
2024-03-14 23:53:47 -04:00
2024-12-17 14:49:29 -05:00
2024-10-24 21:19:15 -04:00