Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fastest way to check if an object exists

I'm using GAE/Java with Objectify, and I'm trying to find the fastest way to check if a given object exists in the datastore, given the key. What I'm doing right now is .get(key) with @Cached on, but either way that still retrieves the entire object, which is unnecessary.

Any ideas on how to do this with an index only hit? I was also thinking of a keys only query, but I'm seeing (on the system status dashboard ) that the latency is much more than a get.

like image 210
Sudhir Jonathan Avatar asked Aug 04 '10 19:08

Sudhir Jonathan


2 Answers

Just perform a get() with the cache turned on. Unless you have a lot of expensive logic in a @PostLoad method, it should be significantly cheaper to fetch the data out of memcache than it is to go all the way to the datastore for even a keys-only query. The cache is your friend.

As a side note, this sounds like premature optimization. Build your app using the most convenient code, then run appstats and find out where the actual costs are in your application. You'll probably find that the expensive parts are not what you think.

like image 124
stickfigure Avatar answered Oct 18 '22 09:10

stickfigure


Any ideas on how to do this with an index only hit? I was also thinking of a keys only query

A keys-only query is the only way to get an index-only hit. Whether it's faster than a get depends on the size of your entity and the size of your index. In a trivial example, I'm getting around 8ms for a get and 13ms for a query. You can use AppStats to figure out which is cheaper for you with real data.

like image 32
Drew Sears Avatar answered Oct 18 '22 10:10

Drew Sears