Re: SQL Performance Help
| From: | Chris | Date: | Thu, 04 Jan 2007 02:13:32 +0000 |
| Subject: | Re: SQL Performance Help | ||
| References: | 1 | Groups: | php.db |
| Request: | Send a blank email to php-db+get-42877@lists.php.net to get a copy of this message | ||
Tony Grimes wrote:
I'm developing a course calendar for a client and I'm running into performance problems with the admin site. For example, when I try to include registration counts in the course list, the page really slows down for large course lists (50 or so):Index your tables, make the database do the work. Much easier and less prone to bugs :) Check you have an index on: events(event_id) event_attendees(event_id) table(start_time) (whichever that table applies to - I assume it's events). Maybe try a multi-column index if this query gets run a lot: create index event_eventid_start_time on events(event_id, start_time); Use 'explain' to see which one is being used and possibly get rid of the other one. I have a guide about how to index databases here: http://www.designmagick.com/article/16/ (Yes it's a postgresql site but the same rules apply to mysql and other databases as well). -- Postgresql & php tutorials http://www.designmagick.com/COURSE ATTENDEES CAPACITY SEATS LEFT ====== ========= ======== ========== Course 1 5 10 5 Course 2 6 15 9 Course 3 4 10 6I've been using one query to retrieve the course list and then one for each attendee count. Is there a more efficient way of doing this all in one query? I was thinking something like this (I'm not a SQL expert, so I don't know if this is even possible): SELECTcourse_name, capacity, count(query here) as attendee_countFROM events AS e LEFT OUTER JOIN event_attendees AS a ON e.event_id = a.event_id WHERE start_time BETWEEN point_a AND point_b Or should I just pull everything as a separate row like this and sort it all out programmatically: SELECTe.course_name, e.capacity, a.user_idFROM events AS e LEFT OUTER JOIN event_attendees AS a ON e.event_id = a.event_id WHERE start_time BETWEEN point_a AND point_b Or should I just try caching the data in PHP? Would an index help?