views:

386

answers:

2

I have a class that retrieves its memeber (more or less 10 members) from a database.

My question is: is it more efficient to fetch them every time from the db (MySQL), leaving just an ID in the session's array or store them directly in the session's array?

And is the difference in performance terms so great? (given a database with say 100.000 rows)

+3  A: 

Depends what you mean by 'efficient'. One's time-efficient, one's disk-space-efficient. And it's very difficult to judge the two against each other, unless your requirements are at either extreme end of the spectrum. You'd probably do OK just flipping a coin, measuring performance over time, and adjusting based on any observed problems.

Premature optimisation is the root of all evil.

Bobby Jack
congratulation for the quotation ;)anyway, my concern is about speed.
klez
Well, they're both ultimately coming from disk, but both are highly likely to be cached, one by the database, one by the OS (or maybe even the web server / PHP module, depending on how things are configured?) Either way, it will be minimal, could change totally depending on future hardware changes, and is probably not worth the effort of thinking of. I'd suggest you just go with what's natural: for a smallish site, I'd guess that could be the session approach; for everything else, database. You might want to avoid the session approach if you're on a shared host, depending on server config.
Bobby Jack
+2  A: 

Considering you're storing an ID in the session anyway, the session makes the most sense. Doing a session_start() loads your session information so whether you've loaded 1 or 10 items after that is largely irrelevant (unless they're really large but that'll be a problem in any case).

So stick with the session.

If you get really concerned about speed use an in-memory cache like APC or memcache. Worrying about speed for 10 items from the filesystem or database is a distraction. The difference is going to be so minimal as to be irrelevant.

Note: the above assumes two things:

  1. The query is performant (retrieving 10 rows out of 100k should be doable in under 0.1 seconds); and
  2. You are doing one query not 10.
cletus