X

XGluk

0
Репутация
0
Рейтинг
#1 Упрощение sql запросов к блогу. v1.10.7 28 марта 2018 в 12:53


@XGluk,
Повесьте на pubdate индекс и посмотрите на результат.

  1. ALTER TABLE cms_blog_posts ADD INDEX(`pubdate`)

Ris
Подскажите куда это вставить, или это sql запрос в phpMyAdmin выполнить?
Ещё заметил такую штуку, сделал вывод последних комментариев, модулем на главную, там тоже выводятся последние комментарии и база комментариев ещё больше чем блогов, но никакого тормоза не наблюдается.
Может можно по аналогии вывода последних комментариев как-то сделать вывод последних блогов?
#2 Упрощение sql запросов к блогу. v1.10.7 28 марта 2018 в 11:48
Ris,
Все компоненты дефолтные без изменений, обновлялись с 1.10.3 по мере выхода новых версий.
поэксперементировав выяснил что проблема вот в этой строчке файла frontend.php
///////////////////////// ПОСЛЕДНИЕ ПОСТЫ //////////////////////////////////////
//устанавливаем сортировку
$inDB->orderBy('p.pubdate', 'DESC');
дело именно в запросе 'p.pubdate'
отключив эту строку торможение пропадает полностью, но блоги выдаются не последние по дате, а первые которые были созданы.
Как изменить запрос чтобы выдавались и последние блоги и не тормозило?
Может возможно как-то выводить блоги по последним id из базы _blog_posts или ещё какой-то запрос который будет выдавать последние записи не запрашивая дату?
#1 Упрощение sql запросов к блогу. v1.10.7 28 марта 2018 в 00:56
Здравствуйте.
На сайте давно наблюдается проблема запросы к базе данных очень тормозят сайт, запросы связаны с блогами.
вот проблемные запросы
Как оптимизировать эти запросы? база данных около 2гб, пользователей онлайн всего до 10-15 бывает.

| 139693 | photoclu_photo | localhost | photoclu_photo | Query | 68 | Sending data | SELECT p.*,
u.nickname as author, u.login, u.is_deleted,
b.allow_who as blog_allow_who,
b.seolink as bloglink,
b.title as blog_title,
b.owner as owner, b.user_id as bloglink, up.imageurl, img.fileurl
FROM pc_blog_posts p
INNER JOIN pc_blogs b ON b.id = p.blog_id
LEFT JOIN pc_users u ON u.id = p.user_id
LEFT JOIN pc_user_profiles up ON up.user_id = u.id
LEFT JOIN pc_upload_images img ON img.target_id = p.id AND img.target = 'blog_post' AND img.component = 'blogs'

WHERE p.published = 1 AND b.owner = 'club'
AND (b.allow_who = 'all')
AND (p.allow_who = 'all')

GROUP BY p.id
ORDER BY p.rating DESC
LIMIT 0, 10 |

Данный запрос выполняется порядка минуты. Если сделать EXPLAIN данного запроса, то видно, что сервер анализирует 186 тысяч записей в базе данных при выполнении, при этом использует сортировку в файлах (это очень медленно), думаю, этот запрос и является основной причиной высокой нагрузки.

+----+-------------+-------+--------+--------------------------------------------------------+-----------+---------+--------------------------+--------+---------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+--------------------------------------------------------+-----------+---------+--------------------------+--------+---------------------------------------------------------------------+
| 1 | SIMPLE | p | ref | PRIMARY,seolink,user_id,title,blog_id,cat_id,allow_who | allow_who | 63 | const,const | 186629 | Using index condition; Using where; Using temporary; Using filesort |
| 1 | SIMPLE | b | eq_ref | PRIMARY | PRIMARY | 4 | photoclu_photo.p.blog_id | 1 | Using where |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 4 | photoclu_photo.p.user_id | 1 | NULL |
| 1 | SIMPLE | up | ref | user_id | user_id | 4 | photoclu_photo.u.id | 1 | NULL |
| 1 | SIMPLE | img | ref | target_id | target_id | 4 | photoclu_photo.p.id | 1 | Using where |
+----+-------------+-------+--------+--------------------------------------------------------+-----------+---------+--------------------------+--------+---------------------------------------------------------------------+

Проблемный запрос находится в файле core/classes/blog.class.php, смотрите функцию getPosts

На странице блогов также тормозит следующий запрос:

| 533 | photoclu_photo | localhost | photoclu_photo | Query | 6 | Sending data | SELECT 1
FROM pc_blog_posts p
INNER JOIN pc_blogs b ON b.id = p.blog_id

WHERE p.published = 1 AND b.owner = 'user'
AND (b.allow_who = 'all')
AND (p.allow_who = 'all') |

Если сделать анализ, то здесь также производится выборка 180 тысяч записей, что очень медленно:

+----+-------------+-------+--------+-------------------+-----------+---------+--------------------------+--------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------+-----------+---------+--------------------------+--------+-----------------------+
| 1 | SIMPLE | p | ref | blog_id,allow_who | allow_who | 63 | const,const | 186318 | Using index condition |
| 1 | SIMPLE | b | eq_ref | PRIMARY | PRIMARY | 4 | photoclu_photo.p.blog_id | 1 | Using where |
+----+-------------+-------+--------+-------------------+-----------+---------+--------------------------+--------+-----------------------+

Данный запрос находится в том же файле core/classes/blog.class.php, функция getPostsCount.
🍪Мы используем файлы cookie для работы сайта. Читать подробнее.