"Updating one vector can move hundreds of attributes and their indexes" is basically Uber's 2016 Postgres write amplification post, but for search. Same fix too: stop pointing indexes at where the row lives.
So ANN becomes a secondary index that points at a doc ID, and vector search now needs a hop to complete. Do clusters keep their own copy of the vectors so the search itself stays local, and only result fetch pays the indirection? Otherwise cold p99 seems like it gets worse.
> don't key on the ANN address. That is precisely the change turbopuffer v3 makes. As you can imagine, it is not a trivial change.
This is a direct parallel to how Postgres and Mysql built indexes.
Your design choice went from a Postgres design pattern to a Mysql one. The difference is the reindexing cost vs the lookup cost - Postgres optimized for lookup and Mysql does for indexing on writes. Or more accurately, Postgres was better with good schema design using joins & mysql was optimized for a bad design with less normalization where many indexes exist for the same table.
Postgres always points an index to a row-id within postgres which is an arbitrary value which changes on each update.
Mysql, always assuming the storage engine is pluggable, points to the primary index entry and adds an extra indirection to the lookup.
This means that you point the mysql index to a stable id, so unless you go update the primary key for a row, you won't have to update the indexes for all the attribute lookups you might have made to data.
I don't do databases any more that much, but the design for NIMBLE file format has a lot of quirks which are relevant to this specific idea (wide tables).
But the old Uber post about switching from Postgres to Mysql to prevent index amplification[1] is a direct mirror to this post.
[1] - https://www.uber.com/us/en/blog/postgres-to-mysql-migration/
TIL I should have been using mysql the whole time
I built a corrective memory layer for our agents which is using filtering, hybrid/ranked fusion search and strongly typed predicates to provide the LLMs context to correct themselves in case of errors.
Small plug, if anyone wants to try it out- https://polign.com/recall
I struggled quite a bit relying on pure vector DBs, so this is a welcome change. You still need vectors to reach close enough areas to fetch the context though.
I see something like taking an auto encoder, cutting it in half to get the discrete latent space, and then mapping documents across that latent space in terms of threshold values.
When storing documents, you just compute their latent space representation, and for each value in the latent space, you have a map of threshold -> document.
When doing a query, you simply map the query into the space, and then filter each value on the activation threshold.
Then when you do a query, that gets mapped to latent space. Then you sequentially check every v
Meanwile do
That way to index documents, you just have to compute their latent space threshold values.
OutOfHere•53m ago
syndacks•49m ago
uproarchat•41m ago
alexjplant•36m ago
throwawy0352•41m ago
If you still have issues, try https://web.archive.org/web/20261001100105/https://turbopuff...
wilj•31m ago
And what's with the throwaway account for this one comment? Is this becoming reddit with throwaway shills now?
phoghed•25m ago
throwawy0352•19m ago
The reason is that I have no account on HN and rarely comment. I create a new account a few times a year because I don't remember or care about my previous account.
I could have made an account named john2026 and you would not think twice. Instead, I let people know upfront what type of account this is. Quite the opposite of what a true shill would do.
I got a Lighthouse score of 99 in Chrome. Believe it or not, I won't spend more of our time on this. (relevant XKCD: https://xkcd.com/386/ )
First Contentful Paint 0.7 s
Largest Contentful Paint 0.9 s
Speed Index 0.7 s
It makes a lot of requests, and some are stopped by my ad blocker, but most of them don't seem to make an difference. It is almost instant from my point of view. I disabled the ad blocker and didn't notice any visual difference.