For issue (1) I'm thinking that maybe the query used when the product view is set to 20 items isn't using an index like the query for the 1000 items view. For issue (2) I'm not sure I understand. Could you rephrase or elaborate? For issue (3), I can create a Tags and ProductTags table. The tags table will have 2 important columns: Tag_ID(integer) and TagName(varchar). The ProductTags will have 2 important columns also: Product_ID and Tag_ID.
I have great experience with PHP, MySQL, JavaScript, and in general programming in general. Also, I'm greatly experienced in bug fixing. I take great enjoyment in debugging issues.
I employ techniques such as stepping through the code with a debugger, code analysis, commenting out code to isolate the issues, trial and error, observing error logs, common sense and utilizing my experience from years of programming.