2012-11-30 2 views
0

Индекс-страница мой форум выглядит следующим образом:MySQL: как ускорить этот запрос (включая подзапросы)?

| Forum | Topics | Answers | 
---------------------------- 
| Forum A | 123 | 45678 | 
| Forum B | 345 | 23128 | 
| Forum C | 567 | 2328 | 

Вот мой SQL-код, который работает до сих пор, но я думаю, что должно быть лучшим решением:

SELECT f.`id`, f.`name`, f.`description`, f.`type`, 

     (SELECT COUNT(`id`) 
     FROM threads 
     WHERE `forum_id` = f.`id`) AS num_threads, 

     (SELECT COUNT(p.`id`) 
     FROM threads t, posts p 
     WHERE p.thread_id = t.id 
      AND t.forum_id = f.id) AS num_posts 

    FROM `forums` f ORDER BY `position` 

Как бы вы ускорить этот запрос? Любые альтернативы подзапросам?

Заранее благодарен!

ответ

1

Что-то вроде этого, вступив основной выбор с парой подзапросов с группой по статьям (таким образом они выполняются один раз, а не один раз в каждой строке)

SELECT f.id, f.name, f.description, f.type, tc.RowCnt, ta.RowCnt 
    FROM `forums` f 
    INNER JOIN (SELECT forum_id, COUNT(id) AS RowCnt FROM threads GROUP BY forum_id) tc 
    INNER JOIN (SELECT forum_id, COUNT(p.id) AS RowCnt FROM threads t INNER JOIN posts p ON p.thread_id = t.id GROUP BY forum_id) ta 
    ORDER BY position 

Вы, вероятно, может улучшить это, делая один из пунктов основного выбора, а не подзаголовка (но в конце пятницы, и я устал!).

+0

Спасибо за ваш ответ, но он не работает - ошибка: # 1054 - Неизвестный столбец 'tc.RowCnt' в 'списке полей' –

+1

Упс, забыли указать имена псевдонимов в подзапросах – Kickstart

2

Узнайте о SQL joins и GROUP BY:

SELECT f.id, f.name, f.description, f.type, 
     COUNT(DISTINCT t.id) AS num_threads, 
     COUNT(*) AS num_posts 
FROM  forums f 
    JOIN threads t ON t.forum_id = f.id 
    JOIN posts p ON p.thread_id = t.id 
GROUP BY f.id 
ORDER BY f.position 

Кроме того, убедитесь, что у вас есть следующие индексы:

  • (id) на forums
  • (id, forum_id) на threads
  • (thread_id) на posts

(MySQL потребует, чтобы вы указали эти индексы, если вы создали foreign key contraints).

+0

Спасибо за ваш ответ! Индексы существуют, но ваш код не работает должным образом. Я получаю только один результат, но я не вижу предела в вашем SQL. –

Смежные вопросы