Скорость загрузки сайта и компонент СтАТЬИ

InstantCMS 1.X
#1 4 января 2017 в 00:51
Здравствуйте!

Как только в админке ставлю выводить на главной статьи (даже если в настройках статей ставлю выводить не больше 10 штук) — тут же по данным tools.pingdom.com
сайт начинает загружаться от 5 и до 11 секунд

без вывода компонента — загружается 1.8 секунды

Возможно ли внедрить какое-то кэширование?

очень медленно работает движок
#2 4 января 2017 в 01:06
@IRIP,
Включите в админке отладку (Настройки — отладка).
Потом внизу ткнитесь в цифру SQL.
Там время выполнения запросов к базе отображается. Гляньте, какой там запрос самый долгий.
#3 4 января 2017 в 13:39
Ris,

SELECT con.id
FROM cms_content con
INNER JOIN cms_category cat ON cat.id = con.category_id AND cat.NSLeft >= '6' AND cat.NSRight <= '7'
WHERE con.published = 1 AND con.is_arhive = 0
Запрос занял 0.63732 с.

/components/content/frontend.php => getArticlesCount()
SELECT 1

FROM cms_content con
INNER JOIN cms_category cat ON cat.id = con.category_id
WHERE con.is_arhive = 0
AND (cat.NSLeft >= '1' AND cat.NSRight <= '100' AND cat.parent_id > 0)
AND (con.published = 1 AND con.pubdate <= '2017-01-04 13:35:59'
AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '2017-01-04 13:35:59')))
Запрос занял 0.10058 с.

/components/content/frontend.php => getArticlesList()
SELECT con.*,
cat.title as cat_title, cat.seolink as catseolink,
cat.showdesc,
u.nickname as author,
u.login as user_login
FROM cms_content con
INNER JOIN cms_category cat ON cat.id = con.category_id
LEFT JOIN cms_users u ON u.id = con.user_id
WHERE con.is_arhive = 0
AND (cat.NSLeft >= '1' AND cat.NSRight <= '100' AND cat.parent_id > 0)
AND (con.published = 1 AND con.pubdate <= '2017-01-04 13:35:59'
AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '2017-01-04 13:35:59')))




ORDER BY pubdate DESC
LIMIT 0, 10
Запрос занял 1.86591 с.


Все остальные запросы заняли от 0.0002с и до 0,00100 с.
#4 4 января 2017 в 14:15
Это так всегда было из-за того, что запрос не по id последним 10 штукам, а сразу в трех таблицах. Причем если у вас статей более 1000 штук, то без memcahce и еже сними будет туго вам. Как часто добавляются статьи? поставьте кэш на сутки, ночью можно по крону делать запрос страницы, чтоб кэш обновлялся когда никого нет на сайте.

Можете запрос скопировать и воткнуть в phpmyadmin увидите сколько обрабатывается и как тяжко все это.
#5 4 января 2017 в 17:21

Это так всегда было из-за того, что запрос не по id последним 10 штукам, а сразу в трех таблицах

kirkr

Вот запрос из четырех таблиц, причем в каждой больше тысячи строк, а в cms_anec_quests — больше 85000.

  1. /components/anec/frontend.php => anec()
  2. SELECT q.*, c.title cat_title, c.id cid, u.login, u.nickname, r.item_id rid
  3. FROM cms_anec_quests q
  4. LEFT JOIN cms_ratings r ON r.target = 'quest' AND r.item_id = q.id AND r.user_id = 86
  5. LEFT JOIN cms_anec_cats c ON c.id = q.category_id
  6. LEFT JOIN cms_users u ON u.id = q.user_id
  7. WHERE q.published = 1
  8. ORDER BY q.id DESC
  9. LIMIT 0, 40
  10. Запрос занял 0.03168 с.
Что-то у топикстартера не так.
Кэширование надо обязательно как-то настроить.

поставьте кэш на сутки

kirkr
Да хоть на час, уже движку легче будет.

AND (con.published = 1 AND con.pubdate <= '2017-01-04 13:35:59'
AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '2017-01-04 13:35:59')))

@IRIP

Может на pubdate и enddate индекс поставить? По любому быстрее будет.
#6 4 января 2017 в 18:06
Ris,

Может на pubdate и enddate индекс поставить? По любому быстрее будет.

Ris
пока он сам запрос не перепроверит и таблицы не оптимизирует облегчения не стоит ждать.
#7 4 января 2017 в 18:44


Причем если у вас статей более 1000 штук...

kirkr

36к статей


то без memcahce и еже сними будет туго вам.

kirkr

Ставил memcached — он грузил очень сильно систему. Посещаемость ресурса около 1500 человек в день. При такой нагрузке mem… как-то совсем бесполезен. Он висит в памяти, и грузит систему.
с включением mem, а у меня php Версии 5.3
главная с отключенными компонентами по данным tools pingdom — 0.8 секунды (отдача самой страницы, без JS и т.п.)
с включенным mem на это уходит 1.3 сек.


Как часто добавляются статьи? поставьте кэш на сутки, ночью можно по крону делать запрос страницы, чтоб кэш обновлялся когда никого нет на сайте.

kirkr

Статьи, форум, объявления, комментарии — по 25-30 в день

тяжко… согласен
#8 4 января 2017 в 19:20


Вот запрос из четырех таблиц, причем в каждой больше тысячи строк, а в cms_anec_quests — больше 85000.

Что-то у топикстартера не так.
Кэширование надо обязательно как-то настроить.

Может на pubdate и enddate индекс поставить? По любому быстрее будет.

Ris


/components/content/frontend.php => getArticlesList()
SELECT con.*,
cat.title as cat_title, cat.seolink as catseolink,
cat.showdesc,
u.nickname as author,
u.login as user_login
FROM cms_content con
INNER JOIN cms_category cat ON cat.id = con.category_id
LEFT JOIN cms_users u ON u.id = con.user_id
WHERE con.is_arhive = 0
AND (cat.NSLeft >= '1' AND cat.NSRight <= '100' AND cat.parent_id > 0)
AND (con.published = 1 AND con.pubdate <= '2017-01-04 18:47:11'
AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '2017-01-04 18:47:11')))




ORDER BY pubdate DESC
LIMIT 0, 10

Запрос обращается к этим таблицам (те, что сейчас на сервере стоят):

CREATE TABLE `cms_content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL DEFAULT '1',
`pubdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`enddate` date NOT NULL,
`is_end` int(11) NOT NULL,
`title` varchar(200) NOT NULL,
`description` text NOT NULL,
`content` mediumtext,
`published` int(11) NOT NULL DEFAULT '1',
`is_favorite` int(1) NOT NULL DEFAULT '0',
`hits` int(11) NOT NULL DEFAULT '0',
`rating` int(11) NOT NULL DEFAULT '0',
`meta_desc` mediumtext NOT NULL,
`meta_keys` mediumtext NOT NULL,
`showtitle` int(11) NOT NULL DEFAULT '1',
`showdate` int(11) NOT NULL DEFAULT '1',
`showlatest` int(11) NOT NULL DEFAULT '1',
`showpath` int(11) NOT NULL DEFAULT '1',
`ordering` int(1) NOT NULL,
`comments` int(11) NOT NULL DEFAULT '1',
`is_arhive` int(11) NOT NULL,
`seolink` varchar(200) NOT NULL,
`canrate` int(11) NOT NULL DEFAULT '1',
`pagetitle` varchar(255) NOT NULL,
`url` varchar(100) NOT NULL,
`tpl` varchar(50) NOT NULL DEFAULT 'com_content_read.tpl',
`parse` varchar(500) NOT NULL,
`images` text,
PRIMARY KEY (`id`),
KEY `category_id` (`category_id`),
KEY `user_id` (`user_id`),
KEY `seolink` (`seolink`),
FULLTEXT KEY `title` (`title`),
FULLTEXT KEY `content` (`content`)
) ENGINE=MyISAM AUTO_INCREMENT=23405 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
CREATE TABLE `cms_category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`title` varchar(200) NOT NULL,
`description` text NOT NULL,
`published` tinyint(1) NOT NULL,
`showdate` tinyint(1) NOT NULL DEFAULT '1',
`showcomm` tinyint(1) NOT NULL DEFAULT '1',
`orderby` varchar(30) NOT NULL DEFAULT 'date',
`orderto` varchar(4) NOT NULL DEFAULT 'asc',
`modgrp_id` int(11) NOT NULL,
`NSLeft` int(11) NOT NULL,
`NSRight` int(11) NOT NULL,
`NSLevel` int(11) NOT NULL,
`NSDiffer` varchar(11) NOT NULL,
`NSIgnore` int(11) NOT NULL,
`ordering` int(11) NOT NULL,
`maxcols` int(11) NOT NULL DEFAULT '1',
`showtags` tinyint(1) NOT NULL DEFAULT '1',
`showrss` tinyint(1) NOT NULL DEFAULT '1',
`showdesc` tinyint(1) NOT NULL,
`is_public` tinyint(1) NOT NULL,
`photoalbum` text NOT NULL,
`seolink` varchar(200) NOT NULL,
`url` varchar(100) NOT NULL,
`tpl` varchar(50) NOT NULL DEFAULT 'com_content_view.tpl',
`cost` varchar(5) NOT NULL,
`metakeys` varchar(250) NOT NULL,
`metadesc` varchar(250) NOT NULL,
`categorytitle` varchar(100) NOT NULL,
`pagetitle` varchar(200) NOT NULL DEFAULT '',
`meta_keys` varchar(250) NOT NULL DEFAULT '',
`meta_desc` varchar(250) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `seolink` (`seolink`),
KEY `parent_id` (`parent_id`),
KEY `NSLeft` (`NSLeft`,`NSRight`)
) ENGINE=MyISAM AUTO_INCREMENT=129 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
CREATE TABLE `cms_users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL DEFAULT '1',
`login` varchar(100) NOT NULL,
`nickname` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`phone` varchar(12) NOT NULL DEFAULT '',
`icq` varchar(15) NOT NULL,
`regdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`logdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`birthdate` date NOT NULL DEFAULT '0000-00-00',
`is_locked` int(11) NOT NULL,
`is_deleted` int(11) NOT NULL,
`is_logged_once` tinyint(4) NOT NULL DEFAULT '0',
`rating` int(11) NOT NULL,
`points` int(11) NOT NULL,
`video_count` int(11) NOT NULL,
`video_hits_count` int(11) unsigned NOT NULL DEFAULT '0',
`last_ip` varchar(15) NOT NULL,
`status` varchar(255) NOT NULL,
`status_date` datetime NOT NULL,
`invited_by` int(11) DEFAULT NULL,
`invdate` datetime DEFAULT NULL,
`balance` float NOT NULL DEFAULT '0',
`ref_id` int(11) NOT NULL DEFAULT '0',
`openid` varchar(250) DEFAULT NULL,
`poputi` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `login` (`login`),
KEY `openid` (`openid`),
KEY `email` (`email`),
KEY `birthdate` (`birthdate`),
KEY `group_id` (`group_id`),
KEY `invited_by` (`invited_by`)
) ENGINE=MyISAM AUTO_INCREMENT=1397 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

может в них ключи не прописаны какие-нибудь?
#9 4 января 2017 в 20:35
@IRIP,
Вы зря мне все эти таблицы выводите. У меня есть сайт на первой ветке.Вот вывод статей компонентом на главной:

  1. /components/content/frontend.php => getArticlesList()
  2. SELECT con.*,
  3. con.pubdate AS fpubdate,
  4. cat.title AS cat_title, cat.seolink AS catseolink,
  5. cat.showdesc,
  6. u.nickname AS author,
  7. u.login AS user_login
  8. FROM cms_content con
  9. INNER JOIN cms_category cat ON cat.id = con.category_id
  10. LEFT JOIN cms_users u ON u.id = con.user_id
  11. WHERE con.is_arhive = 0
  12. AND (con.category_id = '6')
  13. AND (con.published = 1 AND con.pubdate <= '2017-01-04 20:26:06'
  14. AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '2017-01-04 20:26:06')))
  15.  
  16.  
  17.  
  18.  
  19. ORDER BY pubdate ASC
  20. LIMIT 0, 100
  21. Запрос занял 0.00035 с.
Меньше одной тысячной секунды!

Если честно, мне вообще непонятно, как выборка статей может так долго длиться.
Такое ощущение, что проблема с хостингом.

Я бы рекомендовал скачать базу данных на комп, развернуть локальный сайт на каком-нибудь денвере\опенсервере, подключить к тому сайту эту базу данных и посмотреть, как оно будет работать на локальном.
#10 4 января 2017 в 23:22
Пробовал на локалке. Ситуация аналогичная!

А выкладывал для того, чтобы участники дискуссии проверили, если не затруднит, все у меня выставлены ключи в этих таблицах правильно
или нет
#11 5 января 2017 в 00:17
У меня в таблицах


cms_content Показать
cms_category Показать
cms_users

правильно ключи стоят?

в некоторых случаях запрос занимает до 11 секунд!

/components/content/frontend.php => getArticlesList()
SELECT con.*,
cat.title as cat_title, cat.seolink as catseolink,
cat.showdesc,
u.nickname as author,
u.login as user_login
FROM cms_content con
INNER JOIN cms_category cat ON cat.id = con.category_id
LEFT JOIN cms_users u ON u.id = con.user_id
WHERE con.is_arhive = 0
AND (cat.NSLeft >= '1' AND cat.NSRight <= '100' AND cat.parent_id > 0)
AND (con.published = 1 AND con.pubdate <= '2017-01-05 00:27:58'
AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '2017-01-05 00:27:58')))




ORDER BY pubdate DESC
LIMIT 0, 10
Запрос занял 11.37947 с.
#12 5 января 2017 в 00:39
Ris, детальный анализ вашего и моего запроса показал значительные различия!



у меня версия 1.10.7
#13 5 января 2017 в 01:39
@IRIP, Сколько вашему сайту лет, большая база? Устанавливали дополнительные плагины, модули, компоненты? Отключите, для начала все лишнее и левое. Как сайт работает на дефолтном шаблоне? Надеюсь вам ответы на эти вопросы помогут решить проблему.
#14 5 января 2017 в 01:41
я разобрался в чем причина!
действительно, когда убираешь "хак" позволяющий выводить все статьи из подкатегорий в родительской категории

то нагрузка падает, и компонент статьи очень шустро работает

вот этот хак: в компонентс/контент/фронтэнд.пхп

  1.  
  2. // Условия
  3. //$model->whereCatIs($cat['id']);
  4. $model->whereThisAndNestedCats($cat['NSLeft'], $cat['NSRight']);
  5.  
условие первое комментируем, второе добавляем!

но вот проблема —
это дает большую нагрузку на базу данных.
может можно KEY какой-нибудь, чтобы оптимизировать скорость?
#15 5 января 2017 в 12:09
как бы теперь это правильно в ключи обвернуть, чтобы уменьшить нагрузку

  1. ALTER TABLE `cms_category` ADD INDEX ( `parent_id` , `NSLeft` , `NSRight` ) ;
Вроде помогло
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.