Показать сообщение отдельно
Старый 08.05.2011, 13:32   #2
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

Универсальность tt_news и следование TYPO3-way практике разработки ведут к неэффективности SQL запросов.

У меня на сервере лог медленных запросов на 95% состоит из запросов tt_news. Пример двух последовательных запросов. Они по определению не могут быстрыми. И результат на лицо - второй запрос выполняется 0.5 секунды выбирая при этом всего 7 записей.

Железо очень быстрое, сайт довольно нагруженный - днем, по статистике, mysql обрабатывает около 1000 запросов заждую секунду.
В tt_news чуть больше 10 тыс. записей новостей и 30 записей категорий.

Код:
***** 17-03-2011 18:05:11
***** TIME = 58.828 ms
SELECT COUNT(DISTINCT tt_news.uid)
	FROM tt_news LEFT OUTER JOIN tt_news_cat_mm ON tt_news.uid = tt_news_cat_mm.uid_local
	WHERE
		1=1  
		AND (tt_news_cat_mm.uid_foreign IN (1,32,21,25,7,11,55)) 
		AND tt_news.uid NOT IN (9146) 
		AND tt_news.sys_language_uid IN (0,-1) 
		AND tt_news.pid > 0  
		AND tt_news.uid NOT IN (9146) 
		AND tt_news.pid IN (85,86,87,88,137,369,520) 
		AND tt_news.deleted=0 
		AND tt_news.t3ver_state!=1 
		AND tt_news.hidden=0 
		AND (tt_news.starttime<=1300377910) 
		AND (tt_news.endtime=0 
			OR tt_news.endtime>1300377910) 
		AND (tt_news.fe_group='' 
			OR tt_news.fe_group IS NULL 
			OR tt_news.fe_group='0' 
			OR (tt_news.fe_group LIKE '%,0,%' 
			OR tt_news.fe_group LIKE '0,%' 
			OR tt_news.fe_group LIKE '%,0' 
			OR tt_news.fe_group='0') 
			OR (tt_news.fe_group LIKE '%,-2,%' 
			OR tt_news.fe_group LIKE '-2,%' 
			OR tt_news.fe_group LIKE '%,-2' 
			OR tt_news.fe_group='-2') 
			OR (tt_news.fe_group LIKE '%,3,%' 
			OR tt_news.fe_group LIKE '3,%' 
			OR tt_news.fe_group LIKE '%,3' 
			OR tt_news.fe_group='3') 
			OR (tt_news.fe_group LIKE '%,6,%' 
			OR tt_news.fe_group LIKE '6,%' 
			OR tt_news.fe_group LIKE '%,6' 
			OR tt_news.fe_group='6') 
			OR (tt_news.fe_group LIKE '%,7,%' 
			OR tt_news.fe_group LIKE '7,%' 
			OR tt_news.fe_group LIKE '%,7' 
			OR tt_news.fe_group='7') 
			OR (tt_news.fe_group LIKE '%,9,%' 
			OR tt_news.fe_group LIKE '9,%' 
			OR tt_news.fe_group LIKE '%,9' 
			OR tt_news.fe_group='9'))

****** 17-03-2011 18:05:11
****** TIME = 500.765ms
SELECT DISTINCT tt_news.uid, tt_news.*
	FROM tt_news LEFT OUTER JOIN tt_news_cat_mm ON tt_news.uid = tt_news_cat_mm.uid_local
	WHERE
		1=1  
		AND (tt_news_cat_mm.uid_foreign IN (1,32,21,25,7,11,55)) 
		AND tt_news.uid NOT IN (9146) 
		AND tt_news.sys_language_uid IN (0,-1) 
		AND tt_news.pid > 0  
		AND tt_news.uid NOT IN (9146) 
		AND tt_news.pid IN (85,86,87,88,137,369,520) 
		AND tt_news.deleted=0 
		AND tt_news.t3ver_state!=1 
		AND tt_news.hidden=0 
		AND (tt_news.starttime<=1300377910) 
		AND (tt_news.endtime=0 
			OR tt_news.endtime>1300377910) 
		AND (tt_news.fe_group='' 
			OR tt_news.fe_group IS NULL 
			OR tt_news.fe_group='0' 
			OR (tt_news.fe_group LIKE '%,0,%' 
			OR tt_news.fe_group LIKE '0,%' 
			OR tt_news.fe_group LIKE '%,0' 
			OR tt_news.fe_group='0') 
			OR (tt_news.fe_group LIKE '%,-2,%' 
			OR tt_news.fe_group LIKE '-2,%' 
			OR tt_news.fe_group LIKE '%,-2' 
			OR tt_news.fe_group='-2') 
			OR (tt_news.fe_group LIKE '%,3,%' 
			OR tt_news.fe_group LIKE '3,%' 
			OR tt_news.fe_group LIKE '%,3' 
			OR tt_news.fe_group='3') 
			OR (tt_news.fe_group LIKE '%,6,%' 
			OR tt_news.fe_group LIKE '6,%' 
			OR tt_news.fe_group LIKE '%,6' 
			OR tt_news.fe_group='6') 
			OR (tt_news.fe_group LIKE '%,7,%' 
			OR tt_news.fe_group LIKE '7,%' 
			OR tt_news.fe_group LIKE '%,7' 
			OR tt_news.fe_group='7') 
			OR (tt_news.fe_group LIKE '%,9,%' 
			OR tt_news.fe_group LIKE '9,%' 
			OR tt_news.fe_group LIKE '%,9' 
			OR tt_news.fe_group='9'))
	ORDER BY datetime DESC
	LIMIT 7
dmartynenko вне форума   Ответить с цитированием