dmartynenko |
08.05.2011 13:32 |
Универсальность 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
|