Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Помогите оптимизировать запрос (PeaceCoder) 27/06/2009 - 13:59:50
      Re: Помогите оптимизировать запрос (PeaceCoder) 27/06/2009 - 15:22:46
      Re: Тема закрыта (PeaceCoder) 27/06/2009 - 16:07:59



From: PeaceCoder - 27/06/2009 - 13:59:50
Subject:Помогите оптимизировать запрос
-----------------
$ti_ = SQL::q("SELECT SQL_CACHE SQL_CALC_FOUND_ROWS FM.*,
(SELECT MAX(TimeSee) FROM forum_see WHERE ".($UI->info['ID'] ? "UserID='{$UI->info['ID']}'":"UserID REGEXP '[0-9]+\.[0-9]+'")." AND ForumID=FM.ID AND Active='1') AS MaxISee,
(SELECT COUNT(*) FROM forum_posts WHERE `Time`>IFNULL(MaxISee,0) AND InForumID=FM.ID) AS CountUnread,
(SELECT ID FROM forum_posts WHERE `Time`<=IFNULL(MaxISee,0) AND InForumID=FM.ID ORDER BY `Time` DESC LIMIT 1) AS FirstUnreadPostID,
(SELECT COUNT(*) FROM forum_see WHERE Active='1' AND `Type`='Topic') AS CountSeeAllTopics,
(SELECT View FROM users WHERE ID=FM.UserID) AS AutorView,
(SELECT Color FROM groups WHERE ID=(SELECT GroupID FROM groups_sostav WHERE Basic='1' AND UserID=FM.UserID)) AS AutorColor,
(SELECT COUNT(*) FROM forum_posts WHERE InForumID=FM.ID) AS CountAnses,
(SELECT COUNT(*) FROM forum_see WHERE ForumID=FM.ID AND Active='1') AS CountSee,
(SELECT COUNT(*) FROM forum_see AS FS WHERE Active='1' AND ForumID=FM.ID AND TimeSee=(SELECT MAX(TimeSee) FROM forum_see WHERE UserID=FS.UserID) AND TimeSee>'".(gmdate('U')-5*60)."') AS CountNowSee,
(SELECT UserID FROM forum_posts WHERE InForumID=FM.ID ORDER BY Time DESC LIMIT 1) AS LastAutorID,
(SELECT View FROM users WHERE ID=LastAutorID) AS LastAutorView,
(SELECT Color FROM groups WHERE ID=(SELECT GroupID FROM groups_sostav WHERE Basic='1' AND UserID=LastAutorID)) AS LastAutorColor,
(SELECT MAX(`Time`) FROM forum_posts WHERE InForumID=FM.ID) AS LastPostTime,
(SELECT ID FROM forum_posts WHERE InForumID=FM.ID ORDER BY `Time` DESC LIMIT 1) AS LastPostID
FROM forum AS FM WHERE `Type`='2' AND ".($status ? "(((SELECT TreeIDs FROM forum WHERE ID='$ForumID') REGEXP CONCAT('^| ',FM.InForumID,' |$') AND FM.`Status`='announce') OR (FM.InForumID='$ForumID' AND FM.`Status`='pinned')) ":"FM.InForumID='$ForumID' AND FM.`Status` IS NULL ").($find ? "AND FM.Name REGEXP '".SQL::AntiSQL($find)."'" :"")." ORDER BY `Status` DESC, `LastPostTime` DESC ".(!$status ? "LIMIT $start,$onpage":""));

где $UI->info информация о юзере, если ID=0 в forum_see.UserID заносится microtime(1);
$status указывать выводить темы только со статусом annonce|pinned или все другие в текущем $ForumID

В частности как я понял запрос долго выполняется изза COUNT(*). Как можно посчитать количество строк не напрягая мускул при определенном WHERE?
Это запрос на вывод информации от темах в текущем(и темах при статусе announce в корневых форумах) форуме.
запрос выполняется 0.3сек и пофиг при количестве результатов >0.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
35820



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |