我是工作在一个网站,有60k+论坛的主题,这是非常缓慢的。问题是核心论坛模块使用以下查询
SELECT ncs.last_comment_timestamp AS last_comment_timestamp
, ncs.last_comment_uid AS last_comment_uid
, CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u2.name END AS last_comment_name FROM node n
INNER JOIN users u1 ON n.uid = u1.uid
INNER JOIN forum f ON n.vid = f.vid AND f.tid = '22'
INNER JOIN node_comment_statistics ncs ON n.nid = ncs.nid
INNER JOIN users u2 ON ncs.last_comment_uid = u2.uid WHERE (n.status = '1') ORDER BY last_comment_timestamp DESC LIMIT 1 OFFSET 0我看到这个查询是问题所在,因为在运行top命令之后,我看到mysql正在消耗150%+ CPU,所以我运行了一个显示完整处理列表,显示上面的查询始终处于以下状态
Copying to tmp table SELECT ncs.last_comment_timestamp AS last_comment_timestamp, ncs.last_comment_uid AS last_comment_uid, CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u2.name END AS last_comment_name\nFROM \nnode n\nINNER JOIN users u1 ON n.uid = u1.uid\nINNER JOIN forum f ON n.vid = f.vid AND f.tid = '22'\nINNER JOIN node_comment_statistics ncs ON n.nid = ncs.nid\nINNER JOIN users u2 ON ncs.last_comment_uid = u2.uid\nWHERE (n.status = '1') \nORDER BY last_comment_timestamp DESC\nLIMIT 1 OFFSET 0解释命令的结果是
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE f ref PRIMARY,tid tid 4 const 30030 Using index; Using temporary; Using filesort
1 SIMPLE n eq_ref PRIMARY,vid,node_status_type,uid vid 4 drupal.f.vid 1 Using where
1 SIMPLE ncs eq_ref PRIMARY,last_comment_uid PRIMARY 4 drupal.n.nid 1
1 SIMPLE u2 eq_ref PRIMARY PRIMARY 4 drupal.ncs.last_comment_uid 1 Using where
1 SIMPLE u1 eq_ref PRIMARY PRIMARY 4 drupal.n.uid 1 Using where; Using index有什么办法来提高这里的表现吗?
谢谢
发布于 2011-07-19 00:53:02
如果你删除了统计数据,那么事情就会一扫而空。根据我的理解,drupal统计数据不能很好地扩展。
发布于 2011-07-18 18:50:58
非常模糊的问题很可能是特定于系统的,但是您可以尝试的第一件事是调优数据库服务器。如果您正在运行D6,那么您可以尝试使用DB调谐器,但显然这没有D7版本。
大部分模块都是基于MySQL调谐器的,它将对一个实时数据库进行检查,并给出相应的参数调整建议。
发布于 2011-07-20 11:18:43
ORDER BY强制MySQL将选定的行存储在内部临时表中,以便在返回结果集之前对它们进行排序。如果这个结果集超出了MySQL在内存中的处理能力,则临时表必须存储在磁盘上。显然,这严重影响了性能。
内存中临时表的最大大小是tmp_table_size和max_heap_table_size值的最小值。您可以尝试在my.cnf中增加这些值,看看它是否加快了执行速度。mysqltuner将在这里给您提供有价值的提示。
在我看来,该语句经过了大量(数据库)工作,只返回一个结果行。对其进行优化可以获得显著的性能增益。不幸的是,我现在没有时间。
https://drupal.stackexchange.com/questions/7309
复制相似问题