GameMusic Posted September 3, 2006 Share Posted September 3, 2006 SELECT t1.*FROM boardposts t1INNER JOIN boardposts t2 ON ( t2.topic =766AND t2.replyTo = 47069 )WHERE t1.topic = 766AND (t1.replyTo = t2.id OR t1.id = t2.id)ORDER BY t1.addDateLIMIT 0 , 20I'm selecting a post and each reply to that post, and replies to those replies. This query runs slowly (3 to 4 seconds) on a huge topic (12,000 replies) when selecting the first post.But the weird thing is, if I try to find the COUNT(*) or COUNT(t1.*) (for the purpose of pagination) the query runs a LONG time and the entire boardposts table is locked until I stop the process. This doesn't make sense to me because I'd assume an internal counter would be faster than returning the data. Quote Link to comment Share on other sites More sharing options...
fenway Posted September 3, 2006 Share Posted September 3, 2006 Post the EXPLAIN output. Quote Link to comment Share on other sites More sharing options...
GameMusic Posted September 4, 2006 Author Share Posted September 4, 2006 EXPLAIN SELECT COUNT( * )FROM boardposts t1INNER JOIN boardposts t2 ON ( t2.topic =766AND t2.replyTo =47069 )WHERE t1.topic =766AND (t1.replyTo = t2.idOR t1.id = t2.id)ORDER BY t1.addDateLIMIT 0 , 20[code]id select_type table type possible_keys key key_len ref rows Extra1 SIMPLE t1 ref id_2,byTopic,byReplyTo byTopic 4 const 12943 Using where; Using filesort1 SIMPLE t2 ref id_2,byTopic,byReplyTo byReplyTo 4 const 7185 Using where1 SIMPLE t1 ref id_2,byTopic,byReplyTo byTopic 4 const 12943 Using where1 SIMPLE t2 ref id_2,byTopic,byReplyTo byReplyTo 4 const 7185 Using where[/code]The first 2 are the data query, and the second 2 are the count querytopic = id of the topicreplyTo = id of the post that post is a reply to Quote Link to comment Share on other sites More sharing options...
fenway Posted September 4, 2006 Share Posted September 4, 2006 Ok, a few things -- first, if you can create an (topic,replyTo), you'll be able to take advantage of this index for the JOIN condition, which is important. Second, it's going to hard to get MySQL to use a proper index with AND/OR clauses for t1. Third, I'm not really sure why the COUNT() would be slower, unless you have no limit clause. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.