准备启动一个仅依赖于数据库查询的新平台。
最重的页面,用户看到的第一页处理一堆查询,一些更复杂的查询。我有“新闻源”,这是一个更重的问题:
$friends = User::getLogged()->Friends->getPrimaryKeys() ;
$friends[] = User::getLogged()->id ;
$query = $this->createQuery('o')->addSelect('o.*')
->leftJoin('o.Creator u')->leftJoin('u.Avatarimage av')->addSelect('u.*, av.*')->addSelect('u.id, av.*, u.display_name AS creators_display_name')
->leftJoin('u.Profiletype t')
->leftJoin('t.ProfiletypeTranslation tm WITH tm.translation_id=?', Translation::getForVisitor()->id)->addSelect('tm.name AS creators_profiletype_name')
// for type: NEW_IMAGES_IN_ALBUM
->leftJoin('o.NewImagesInAlbum i WITH i.album_id=o.album_id')->addSelect('i.id, i.filename, i.width, i.height')
->leftJoin('o.Album a')->addSelect('a.id, a.name AS album_name')
// for type: NEW_CASTING
->leftJoin('o.Casting s')
->addSelect('s.*, s.title AS castings_title')
// for type: NEW_COMMENT_ON_IMAGE
->leftJoin('o.Comment c')
->leftJoin('c.User u1')->addSelect('c.*, u1.display_name AS receivers_display_name')
->leftJoin('c.Image i2')
->leftJoin('i2.Album a2')->addSelect('a2.name AS album_of_commented_image')
// for type: NEW_FRIENDSHIP
->leftJoin('o.NewFriends nf')
->leftJoin('nf.Avatarimage nfav')
->addSelect('nf.*, nfav.*')
->orderBy('created_at DESC')
->whereIn('o.creator_id', $friends)
->andWhereIn('o.type', array
(
Activity::NEW_IMAGES_IN_ALBUM,
Activity::NEW_PROFILE_STATUS,
// Activity::NEW_COMMENT_ON_USER,
Activity::NEW_COMMENT_ON_IMAGE,
Activity::NEW_CASTING,
Activity::NEW_FRIENDSHIP,
Activity::NEW_AVATAR
)
)
// ->where('type=?', 1)
// ->groupBy('o.id')
->limit(20) ;
return $query->execute() ;
这是页面上最大的查询,还有另一个查找通知的大查询,另外3个查找邮件的小查询等...
页面感觉它立即加载到我,但使用Chrome,Chrome显示452ms等待(CPU处理我所有该死的类文件),然后另外200ms来交付/加载所有内容,所以总共650ms来显示所有内容。
在用户互动和社交网络的世界中,这对用户来说会变慢吗?我是否需要尝试进一步优化?我正在运行双核六核xeon 2.4ghz(共12核)。我可能需要升级到更快的速度来处理所有用户并减少PHP加载所有类文件所需的时间。
您对使用Doctrine的450毫秒有什么想法?
答案 0 :(得分:1)
粗略地查看一下您的查询会告诉我您基本上每个查询都使用select *,这对于具有性能的数据库服务器没有帮助。