Joomla慢查询

时间:2011-09-13 18:47:05

标签: mysql joomla

我有一个约有4k篇文章的joomla。查询运行速度很慢。 下面是一个mysql慢查询日志。

# Query_time: 8.906729  Lock_time: 0.000470 Rows_sent: 4  Rows_examined: 5110986
SET timestamp=1315935450;
SELECT a.id, a.title, a.alias, a.title_alias, a.introtext, a.checked_out, a.checked_out_time, a.catid, a.created, a.created_by, a.created_by_alias, CASE WHEN a.modified = 0 THEN a.created ELSE a.modified END as modified, a.modified_by, uam.name as modified_by_name,CASE WHEN a.publish_up = 0 THEN a.created ELSE a.publish_up END as publish_up, a.publish_down, a.attribs, a.metadata, a.metakey, a.metadesc, a.access, a.hits, a.xreference, a.featured, LENGTH(a.fulltext) AS readmore ,CASE WHEN badcats.id is not null THEN 0 ELSE a.state END AS state,c.title AS category_title, c.path AS category_route, c.access AS category_access, c.alias AS category_alias,CASE WHEN a.created_by_alias > ' ' THEN a.created_by_alias ELSE ua.name END AS author,ua.email AS author_email,contact.id as contactid,parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias,ROUND( v.rating_sum / v.rating_count ) AS rating, v.rating_count as rating_count,c.published, CASE WHEN badcats.id is null THEN c.published ELSE 0 END AS parents_published
FROM ql8wt_content AS a
LEFT JOIN ql8wt_categories AS c ON c.id = a.catid
LEFT JOIN ql8wt_users AS ua ON ua.id = a.created_by
LEFT JOIN ql8wt_users AS uam ON uam.id = a.modified_by
LEFT JOIN ql8wt_contact_details AS contact on contact.user_id = a.created_by
LEFT JOIN ql8wt_categories as parent ON parent.id = c.parent_id
LEFT JOIN ql8wt_content_rating AS v ON a.id = v.content_id
LEFT OUTER JOIN (SELECT cat.id as id FROM ql8wt_categories AS cat JOIN ql8wt_categories AS parent ON cat.lft BETWEEN parent.lft AND parent.rgt WHERE parent.extension = 'com_content' AND parent.published != 1 GROUP BY cat.id ) AS badcats ON badcats.id = c.id
INNER JOIN ql8wt_content_frontpage AS fp ON fp.content_id = a.id
WHERE a.access IN (1,1) AND CASE WHEN badcats.id is null THEN a.state ELSE 0 END = 1 AND (a.publish_up = '0000-00-00 00:00:00' OR a.publish_up <= '2011-09-13 17:37:21') AND (a.publish_down = '0000-00-00 00:00:00' OR a.publish_down >= '2011-09-13 17:37:21')

我如何解决这个问题?

在托管上获得更多CPU?

增加mysql内存(我的托管内存使用量永远不会超过10%)?我已经增加了mysql缓存内存限制。

我应该尝试修复它?

2 个答案:

答案 0 :(得分:2)

实际上很难用如此少的信息说出来,但至少你可以将低效的WHERE子句重写为这个等价物:

WHERE 
    a.access IN (1,1) AND 
    badcats.id IS NULL AND
    a.state = 1 AND
    a.publish_up <= '2011-09-13 17:37:21' AND 
    (a.publish_down = '0000-00-00 00:00:00' OR a.publish_down >= '2011-09-13 17:37:21')

答案 1 :(得分:0)

Joomla模型在数千篇文章中表现不佳。

这些模型非常通用,适用于大多数用途;虽然它确实适用于较大的网站,但它绝对可以使用一些改进。

  1. 使用系统缓存插件
  2. 延长缓存时间
  3. 重写慢查询(特别是在相关文章模块,最新文章等中),只提取您需要的信息
  4. 切换到全文搜索,并删除所有like '%$var%'语句
  5. 在Joomla面前使用清漆加快缓存
  6. 前4个动作使我们的响应时间从1秒到100-150毫秒。 最后一点并不容易,但每页可以达到10-15毫秒。