我有一个约有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缓存内存限制。
我应该尝试修复它?
答案 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模型在数千篇文章中表现不佳。
这些模型非常通用,适用于大多数用途;虽然它确实适用于较大的网站,但它绝对可以使用一些改进。
like '%$var%'
语句前4个动作使我们的响应时间从1秒到100-150毫秒。 最后一点并不容易,但每页可以达到10-15毫秒。