Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 12:06   #1
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию Оптимизация запроса

Болею, голова болит, а работать надо, но выходит только говнокод. Ладно код, но вот некоторые запросы никуда не годятся.
Условие:
Есть некоторая таблица, в которой хранятся сообщения и темы. Отличаются они лишь значением `parent_thread` (у сообщений он равен теме-родителю, а у тем равен нулю). Нужно доставать из таблицы темы по последнему обновлению. Грубо говоря, что свежее создано или там, где свежее последнее сообщение, то и последнее обновилось. Также есть страницы (которые и представляют геморрой). Сейчас у меня запрос с двумя (!!!) вложенными запросами и он будет работать ну очень медленно, как я считаю. Реквестирую помощь с оптимизацией запроса.

Так я запрашиваю все уникальные темы (не смотря на то, запрашиваю я их самих, либо запрашиваю последнее сообщений) :
Код:
			(
				SELECT 
				`id`, `title`, `text`, `time`, `imgs`, `parent_thread`, `author` 
				FROM (SELECT * FROM `threads` WHERE `parent_thread` != 0 ORDER BY `id` DESC) as `temp` 
				GROUP BY `parent_thread`
				ORDER BY `id` DESC
			) 
			UNION 
			(
				SELECT 
				`id`, `title`, `text`, `time`, `imgs`, `parent_thread`, `author` 
				FROM `threads` 
				WHERE `parent_thread` = 0 AND NOT `id` IN (SELECT `parent_thread` FROM `threads` WHERE `parent_thread` != 0 ORDER BY `id` DESC)
				ORDER BY `id` DESC
			) 
			ORDER BY `id` DESC LIMIT ?,?
Последние две подстановки считаю примерно так:
$a = ($page-1)*$limit;
$b = $limit;
Где $page - номер страницы, а $limit - количество тем на странице.

Потом, если `parent_thread` не равен нулю, то заменяю сообщение с `parent_thread` на тему, в которой находится это сообщение.

Такой говнокод.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 11.10.2011, 13:17   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Во второй части от подзапроса избавиться можно с помощью LEFT JOIN, только даст ли это выигрыш - вопрос.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация запроса Spyhunter1983 SQL, базы данных 2 05.10.2011 15:24
Оптимизация запроса stalsoft SQL, базы данных 0 05.07.2011 14:51
оптимизация запроса pray_driver SQL, базы данных 3 13.12.2010 15:40
Оптимизация запроса za4ot SQL, базы данных 0 11.06.2010 09:24
Оптимизация SQL запроса Phantom SQL, базы данных 4 24.09.2009 16:07