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);