Здравствуйте.
На сайте давно наблюдается проблема запросы к базе данных очень тормозят сайт, запросы связаны с блогами.
вот проблемные запросы
Как оптимизировать эти запросы? база данных около 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.