Is this insane?
Marcus Bointon
marcus at synchromedia.co.uk
Sun Dec 3 11:46:59 UTC 2006
On 3 Dec 2006, at 09:47, mike wrote:
> Does it sound crazy to have 30-50 gets per page load? I'm thinking of
> caching each row in a database basically treating it as an object
> based on the primary key. Then fetching the cached information based
> on a list of IDs (basically saving a query of SELECT allthedata FROM
> allthetables WHERE PK IN(key1,key2,key3))
>
> I mean, not all pages will have this - but pages with lists of data
> would; and each item in the list would basically be a row of precached
> data in the database; it would have to be sorted/ordered and such
> differently, so it wouldn't necessarily make sense to just cache the
> entire result set as-is, I'm thinking row-based would be the most
> effective way.
I posted about something similar a while ago, and I'm still not sure
of the best way around it. If you have an object that goes and gets a
list of some related objects, ideally you want to do this in a single
trip to the DB. So here I'd ordinarily do a "select * from mytable
where ...", then use that data to create my objects. Worst case, you
do one big query. Using memcache you might instead do "select id from
mytable where...", then do a "select * from mytable where id = n" for
each object, but lookup in memcache first, worst case you do n+2
queries. The only problem here is that cache misses can take your
query count much higher, so there will have to be a trade-off - the
number of queries into memcache vs the fact that you know you could
get the whole lot in a single DB query. So, a naive implemetation
based solely on getting lists of ids then getting full sets of values
for individual records would normally give horrific performance, but
memcache rescues that situation to a large extent. The question is
how many memcache lookups can you do for the price of that one big
query, and is it worthwhile? Or am I completely wrong?
In answer to your other question, you could cache multiple ordered
lists of IDs with different keynames according to the selected order,
like 'users:lastname,firstname', but still cache the data for each
user record individually, that way you'd get a cache hit no matter
how the data was ordered, and if you happened to pick an ordering
you'd used recently, it wouldn't even have to do the main lookup.
Marcus
--
Marcus Bointon
Synchromedia Limited: Creators of http://www.smartmessages.net/
marcus at synchromedia.co.uk | http://www.synchromedia.co.uk/
More information about the memcached
mailing list