Новости
Документация
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

> Original message text:
> 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.
>


From: PeaceCoder - 27/06/2009 - 16:07:59
Subject:Тема закрыта
-----------------
Все. Вопрос снят. Помогло добавление 1 таблички и парочки ключей. Теперь запрос занимает 0.01 - 0.015 сек.


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

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

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



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