You are here

Drupal专业开发指南 第21章 处理耗费时间的查询

Think in Drupal

下面是一个例子,如何使用devel模块识别缓慢的查询,从来提高站点的性能。假定我们已经编写了一个自定义节点模块task(任务),而且使用hook_load()来向节点对象添加关于任务的附加信息。表的模式如下:

 
CREATE TABLE task (
    nid int,
    vid int,
    percent_done int,
    PRIMARY KEY (nid,vid),
    KEY nid (nid)
);
 
    在运行了devel.module和查看了查询日志以后,我们注意到对前面这个表进行的查询拖累了站点性能!注意超过5毫秒的查询,就被默认为缓慢的(导航到“管理➤站点配置➤Devel设置”,你可以修改这个值)。
 
毫秒            函数           查询
27.16        task_load      SELECT * FROM task WHERE vid = 3
 
    那么,为什么这个查询这么耗费时间呢?如果它是一个使用多表关联的复杂查询,那么我们将考虑使用更好的方式来组织数据,但是在这里它是一个非常简单的查询。首先,我们使用SQL的EXPLAIN语法,来查看数据库是怎么解释这个查询的。当我们在一个SELECT语句前面添加一个关键字EXPLAIN时,数据库将返回这个查询执行计划的相关信息:
 
EXPLAIN SELECT * FROM task WHERE vid = 3
 
    MySQL给出了下面的报告:
 
Id select_type table  type    possible_keys key  key_len  ref  rows  Extra
1  SIMPLE      task    system      NULL      NULL NULL     NULL  1
 
    这里最重要的一列就是key列,它现在为NULL。这告诉我们,MySQL在取回结果集时没有使用任何主键、唯一键、或者索引键;它需要逐行进行查找。所以提升这个查询的速度的最好方式,就是向vid列添加一个唯一键。
 
ALTER TABLE task ADD UNIQUE (vid);
 
    关于MySQL的EXPLAIN的更多信息,可参看http://dev.mysql.com/doc/refman/5.0/en/explain.html
 

Drupal版本: