如果将Yii设置为记录数据库查询('enableParamLogging' => true
在配置文件的db设置中),您可以看到Yii经常查询数据库以查找ActiveRecord查询.
例如:假设您有一个名为的模型,User
并告诉Yii按主键获取用户,Yii将查询数据库三(!)次.它将进行show columns
查询,然后进行show create table
查询,最后它将查询数据库中的实际数据.前两个查询是如此Yii知道您的user
表的架构.如果从应用程序服务器到数据库服务器的往返时间为100毫秒(如果它真的很慢,你应该对它做点什么),那么获得架构的那两个查询将为你的应用程序响应时间增加至少200毫秒.它将为填充User
模型的每个请求执行此操作.根据应用程序的编写方式,它甚至可能在单个请求中多次执行.
另一方面,如果你告诉Yii使用模式缓存,Yii将检查缓存以查看它是否已经知道你的user
表的模式,如果是,它将使用它而不是命中数据库.检查缓存仍然存在延迟,但希望它小于或等于数据库服务器的延迟.假设你正在使用Redis服务器进行缓存,它的延迟也是100毫秒(也非常长).缓存模式仍然比查询数据库更快,因为Yii只需要一次查询缓存来检索模式,而不是两次访问数据库.
因此,在此示例中,从查询架构的高延迟数据库到查询高延迟缓存服务器的切换仍将节省您的时间.实际上,您的缓存应该比数据库具有更低的延迟,因此可以节省更多时间,如果您的应用程序远程复杂,Yii将在每个请求上从多个表加载模式,因此模式缓存可以在请求响应中产生巨大差异时间.
如果您要启用博客,您将看到CActiveRecord
对象在每次应用程序运行时读取其各自的表模式。您可以查看代码CActiveRecord::_construct()
并CActiveRecordMetaData::__construct()
了解这是如何完成的。缓存架构可以减少对数据库的调用次数,从而加快应用程序的速度,因为数据库通常是应用程序的瓶颈。