Thanks Shawn, I'm going to give the temporary table idea a try.
I did omit the 'category' table while testing but when I used EXPLAIN the # of rows for
the thread_link join increased from 105 to 16326 so I decided to leave the category table
in. But I agree, it isn't needed.
My other idea I had was to store the number of 'thread_posts' for a thread inside the
thread table itself. Obviously this wouldn't be normalized and would have to be
maintained or updated frequently to be accurate... It might be a last resort if the temp
table doesn't work out.
... But I like to play by normalization rules as much as possible.
Thanks again, I'll post any performance improvements.