I'm having a bit of a problem with a query that takes a very long time (up to 1 
minute) when many matching rows are found.
The tables are all indexed and the explain seems to indicate that mysql is using the 
indexes but it is still painfully slow:

mysql> SELECT COUNT(TP.thread_id) AS num_posts, MAX(TP.post_date) AS 
latest_date,T.thread_id, T.thread_name, i.post_image
FROM category AS C
    -> INNER JOIN thread_link AS TL USE INDEX(CAT_INDEX) ON C.category_id = 
TL.category_id 
    -> INNER JOIN thread AS T ON TL.thread_id = T.thread_id
    -> INNER JOIN thread_image AS i ON TL.thread_id = i.thread_id
    -> INNER JOIN thread_post AS TP USE INDEX(thread_id) ON TL.thread_id = TP.thread_id
    -> WHERE C.category_id =  '8759'  AND i.display_type =  'thumbnail' AND TP.rating 
> 0
    -> GROUP  BY TL.thread_id
    -> ORDER  BY  'num_posts' DESC 
    -> LIMIT 0 , 20;

... results ...
20 rows in set (37.37 sec)

The above query is a hypothetical query (hint: I'm not doing a forum db) but it pretty 
much matches what I'm doing.  
In this case there are many categories 'C' and a thread 'T' can be in multiple 
categories that link together with a thread_link 'TL'.  Thread posts 'TP' contain the 
individual posts within a thread topic.

I want to select the top 20 thread topics 'T', for a particular category based on the 
number of posts within that thread 'TP'.  I also want to calculate the latest post 
date (when the last post was added).

The tables work fine, the results are fine... it just ISN'T FAST!  Especially if there 
are a lot of threads for that particular category.

Here is the explain data:
+-------+--------+---------------+------------+---------+---------------------+------+---------------------------------+
| table | type   | possible_keys | key        | key_len | ref                 | rows | 
Extra                           |
+-------+--------+---------------+------------+---------+---------------------+------+---------------------------------+
| C     | const  | PRIMARY       | PRIMARY    |       4 | const               |    1 | 
Using temporary; Using filesort |
| TL    | ref    | CAT_INDEX     | CAT_INDEX  |       4 | const               |  105 | 
Using where                     |
| T     | eq_ref | PRIMARY       | PRIMARY    |       4 | TL.product_id       |    1 | 
                                |
| i     | eq_ref | PRIMARY       | PRIMARY    |       5 | TL.thread_id,const |    1 | 
Using where                     |
| TP    | ref    | thread_id    | thread_id |       4 | TL.thread_id       |    2 | 
Using where                     |
+-------+--------+---------------+------------+---------+---------------------+------+---------------------------------+
5 rows in set (0.00 sec)

I think the problem may be with 'Using Temporary; Using Filesort' probably due to the 
GROUP BY???

Here are the indexes:
thread: 
- thread_id (PK)

thread_link: 
- thread_id, category_id (combined PK)
- category_id (CAT_INDEX)

thread_post:
- thread_id, post_id (combined PK)

category:
- category_id

thread_image:
- thread_id,display_type (combined PK)
- thread_id (INDEX)

Major kudos to whom ever can help me out with this!!
- John

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to