drupal优化:点击一个页面的数据库查询是不是只能控制这么低了??欢迎高手来谈论一下

由 drupal66 于 周五, 2008-06-13 12:25 提交。

如提,我用devel测的数据:
Executed 22 queries in 7.87 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 185.92 ms.ms # where query
上面数据库查询22次,网页打开用时只有0.18592秒,不知道是不是最快的了:).下面连每次查询细节也给出,我处理了一下,把用时与次数去掉了:

module_list      SELECT name, filename, throttle FROM system WHERE type = 'module' AND   status = 1 AND bootstrap = 1 ORDER BY weight ASC, filename ASC
drupal_get_filename     SELECT filename FROM system WHERE name = 'user' AND type = 'module'
drupal_lookup_path    SELECT COUNT(pid) FROM url_alias
module_list       SELECT name, filename, throttle FROM system WHERE type = 'module' AND status = 1 ORDER BY weight ASC, filename ASC
user_access     SELECT p.perm FROM role r INNER JOIN permission p ON p.rid = r.rid WHERE r.rid IN (1)
menu_get_item    SELECT * FROM menu_router WHERE path IN ('user') ORDER BY fit DESC LIMIT 0, 1
list_themes      SELECT * FROM system WHERE type = 'theme'
cache_get         SELECT data, created, headers, expire, serialized FROM cache WHERE cid = 'theme_registry:garland'
_node_types_build       SELECT nt.type, nt.* FROM node_type nt ORDER BY nt.type ASC
system_region_list      SELECT info FROM system WHERE type = 'theme' AND name = 'garland'
block_list        SELECT DISTINCT b.* FROM blocks b LEFT JOIN blocks_roles r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = 'garland' AND b.status = 1 AND (r.rid IN (1) OR r.rid IS NULL) ORDER BY b.region, b.weight, b.module
cache_get     SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = 'links:navigation:page-cid:user:1'
cache_get      SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = 'links:navigation:tree-data:b976844687238a3ebacbd788952ea46a'
user_load      SELECT * FROM users u WHERE uid = 0
user_load      SELECT r.rid, r.name FROM role r INNER JOIN users_roles ur ON ur.rid = r.rid WHERE ur.uid = 0
menu_local_tasks SELECT * FROM menu_router WHERE tab_root = 'user' ORDER BY weight, title
cache_get     SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = 'links:primary-links:page-cid:user:1'
cache_get     SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = 'links:primary-links:tree-data:5d6d3aaaaef5fba302ce62698fa37bbe'
cache_get     SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = 'links:secondary-links:page-cid:user:1'
cache_get     SELECT data, created, headers, expire, serialized FROM cache_menu WHERE cid = 'links:secondary-links:tree-data:5d6d3aaaaef5fba302ce62698fa37bbe'
sess_write    SELECT COUNT(*) FROM sessions WHERE sid = 'dc4271527573eb3d832db35f47bd0ddc'
sess_write    UPDATE sessions SET uid = 0, cache = 0, hostname = '127.0.0.1', session = '', timestamp = 1213327917 WHERE sid = 'dc4271527573eb3d832db35f47bd0ddc'

说明一下,我只启用了核心模块和devel模块,目前还没建内容,devel好象不占用数据库查询..针对上面数据提几点疑问希望大家来讨论一下:
1.drupal的基础查询还能再减少吗,尤其是哪个cache_get占了将近1/3,不过内容多了它好象也不怎么增长了
2.别看这个drupal_lookup_path在这里只有一次,如果页面内容很多,它可能占总查询70%;就拿这个站点举例一下,区块里的每条内容好象都要查询一次,而且每次换页都会重复(这是我的分析,有误的话请大家指正:),这可能和内容类型有关,因为这些都是最新内容;但我觉得这些内容如果没有更新就不要再从数据库抓取就好了,不知道能不能实现,清高手指点一下...

大概都是最基本的了

大概都是最基本的了,一个页面特别是内容比较多的主页,几百次查询很正常。

其中 drupal_lookup_path 是比较讨厌,特别是 url alias 比较多的时候,一个页面光对url_alias表就有上百次查询都有可能。有几个相关 path cache 的 patch,但都没有来得及进入 d6,所以只好等到 d7 了。advanced_cache 模块据说会有些帮助,但我没试过。

谢谢大米! 再问一下,pa

谢谢大米!

再问一下,path cache 能减少多少查询,如果每个页面都对url_alias表有上百次查询,如果在线人数高了对速度影响大吗? 我觉得drupal主站 好象也注意到这个问题,当你点击它们论坛的一个主题时,你就只能看到关于这个主题的内容与评论了,,旁边的区块就看不到了,只留用户区块,不象这里这么友好:)
我听说d6比d5的缓存性能好,才想转向d6,但不知道能提高多少,如果用d5在这方面还能提高吗?
另外,我看drupal的缓存好象都是利用服务器端的,把menu,Blocks,form都存进了数据库,每次都要查询一遍;能不能利用客户端缓存,把网页的这些框架储存到客户端?当客户每次点击时只丢给它新的内容就好了...