Andrew, couple of suggestions: 1 - where you use s.status='2' change it to s.status=2 otherwise MySQL is likely casting your data from int to string, which is slow and also precludes using an index.
2 - in this case, instead of using a left join, try using a subquery: WHERE ... AND s.mid NOT IN (SELECT mid FROM ptsContestExclude) - or - change your index around, from UNIQUE (cid,mid) to UNIQUE (mid,cid) due to the way MySQL uses indices you need the queried-upon column(s) listed first(earlier) in the index. These might speed things up HTH, Dan On 1/22/07, altendew <[EMAIL PROTECTED]> wrote:
--- EXPLAIN --- 1 SIMPLE e system cid NULL NULL NULL 0 const row not found 1 SIMPLE s ref sid,status,timeframe status 4 const 20438 Using where; Using temporary; Using filesort 1 SIMPLE m eq_ref PRIMARY,status PRIMARY 4 sc_72.s.mid 1 Using where --- members --- id int(20) No first varchar(255) No last varchar(255) No username varchar(25) No email varchar(255) No password varchar(25) No PRIMARY id --- ptsContestExclude --- cid int(20) No 0 mid int(20) No 0 UNIQUE (cid,mid) --- ptsSignups (all indexes) --- PRIMARY id INDEX (mid,ptsID) INDEX (status,ptsID) INDEX timeframe (mid, status, time) Dan Buettner-2 wrote: > > Andrew, can you post the result of EXPLAIN <query> for your query? > Minus the "FORCE INDEX" too. Also the structure of the other 2 tables > would be helpful as well. > > Thanks, > Dan > > > > On 1/22/07, altendew <[EMAIL PROTECTED]> wrote: >> >> --- ptsSignups -- >> id int(20) No >> mid int(20) No 0 >> ptsID int(20) No 0 >> pps double No 0 >> points double No 0 >> loginID varchar(255) No >> emailConfirm longtext No >> time timestamp Yes CURRENT_TIMESTAMP >> reasonForDeny longtext No >> status int(1) No 1 >> >> --- index (timeframe) --- >> >> timeframe (mid,status,time) >> >> --- query --- >> >> SELECT SUM(s.pps) as earned,m.id,m.username >> FROM ptsSignups s >> FORCE INDEX(timeframe) >> JOIN members m >> ON s.mid=m.id >> AND m.status='Member' >> LEFT JOIN ptsContestExclude e >> ON e.cid=1 >> AND e.mid=m.id >> WHERE >> s.status='2' >> AND s.time>=2004-06-08 >> AND s.time<2008-06-08+INTERVAL 1 DAY >> AND e.mid IS NULL >> GROUP BY s.mid >> HAVING earned>0 >> ORDER BY earned DESC >> >> --- problem --- >> >> `ptsSignups` is a table listing everything my members have completed. >> Sometimes I like to run contests to see who has earned the most. >> `members` >> is a table that contains all my users. `ptsContestExclude` is a table of >> members of whom I would like to exclude from the contest. >> >> What I do first is group the table `ptsSignups` by member id, and >> calculate >> a sum of how much they earned. Then I reorder that sum in Descending >> order >> so the highest earned is on top. >> >> This `ptsSignups` table contains 82752 rows and is 75KB big. It runs >> extremely slow. I tried to create an index for it but it failed to >> increase >> performance. >> >> Any help is appreciated. >> -- >> View this message in context: >> http://www.nabble.com/Help-indexing-this-query.-tf3059045.html#a8505554 >> Sent from the MySQL - General mailing list archive at Nabble.com. >> >> >> -- >> MySQL General Mailing List >> For list archives: http://lists.mysql.com/mysql >> To unsubscribe: >> http://lists.mysql.com/[EMAIL PROTECTED] >> >> > > -- > MySQL General Mailing List > For list archives: http://lists.mysql.com/mysql > To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED] > > > -- View this message in context: http://www.nabble.com/Help-indexing-this-query.-tf3059045.html#a8505966 Sent from the MySQL - General mailing list archive at Nabble.com. -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]