关于thinkphp关联模型的效率问题
2014-08-22 15:45
441 查看
以前听说过thinkphp关联模型效率比较低,但是一直没去看源代码,(现在也没看),今天写rbac的时候才感觉到
三个表及其相关字段如下:
user表,字段:id,nickname
role表,字段:id,remark
role_user表,user_id,role_id
将所有用户列出来,并显示其所在用户组:
一:使用thinkphp的关联模型
user关联模型代码:
代码:
sql执行过程:
使用thinkphp关联模型使用时间加起来时间为0.084171s,相比自己写的sql执行时间漫长很多,而且例子中只有三条数据,当数据量增多的时候,使用thinkphp的关联模型时间会长很多很多,因为每有一条数据,就会执行一条sql语句,执行效率可以想像有多低。所以建议大家自己写sql语句。
而且,有一个更重要的问题是,当你使用orm模型习惯了的时候,你会对原生sql变得陌生,这就变相的使你的能力变弱,orm除了快捷方便一无是处。简单的curd操作可以使用curd,稍微复杂点的就应该自己写了,使用sql你可以更灵活,而且可以自行优化,好处多多。
三个表及其相关字段如下:
user表,字段:id,nickname
role表,字段:id,remark
role_user表,user_id,role_id
将所有用户列出来,并显示其所在用户组:
一:使用thinkphp的关联模型
user关联模型代码:
'Role' => array( 'mapping_type' => MANY_TO_MANY, 'foreign_key' => 'user_id', 'relation_foreign_key'=>'role_id', 'relation_table'=>'role_user', 'mapping_fields'=>'remark',
)控制器代码:
$model=D('User'); $userList=$model->relation(true)->where('status=1')->field('id,nickname')->select();
$this->assign('userList',$userList);sql执行过程:
SHOW COLUMNS FROM `user` [ RunTime:0.056465s ] SELECT `id`,`nickname` FROM `user` WHERE ( status=1 ) [ RunTime:0.005138s ] SHOW COLUMNS FROM `role` [ RunTime:0.006380s ] SELECT b.remark FROM role_user AS a, role AS b WHERE a.role_id = b.id AND a. user_id='2' [ RunTime:0.005514s ] SELECT b.remark FROM role_user AS a, role AS b WHERE a.role_id = b.id AND a. user_id='4' [ RunTime:0.005346s ] SELECT b.remark FROM role_user AS a, role AS b WHERE a.role_id = b.id AND a. user_id='5' [ RunTime:0.005328s ]二:自行写sql语句
代码:
$model=new Model(); $sql="select r.remark as role,u.id,u.nickname from (user as u left join role_user as ru on u.id=ru.user_id) left join role as r on ru.role_id=r.id where u.status=1"; $userList=$model->query($sql);
<pre name="code" class="php">$this->assign('userList',$userList);
sql执行过程:
select r.remark as role,u.id,u.nickname from (user as u left join role_user as ru on u.id=ru.user_id) left join role as r on ru.role_id=r.id where u.status=1 [ RunTime:0.005093s]
使用thinkphp关联模型使用时间加起来时间为0.084171s,相比自己写的sql执行时间漫长很多,而且例子中只有三条数据,当数据量增多的时候,使用thinkphp的关联模型时间会长很多很多,因为每有一条数据,就会执行一条sql语句,执行效率可以想像有多低。所以建议大家自己写sql语句。
而且,有一个更重要的问题是,当你使用orm模型习惯了的时候,你会对原生sql变得陌生,这就变相的使你的能力变弱,orm除了快捷方便一无是处。简单的curd操作可以使用curd,稍微复杂点的就应该自己写了,使用sql你可以更灵活,而且可以自行优化,好处多多。
相关文章推荐
- 关于thinkphp的几个问题:css路径问题,关联模型,
- thinkphp ,进行关联模型的时候出现的问题,版本是3.2
- 关于thinkphp模型中hasOne中字段同名的问题
- 【ThinkPHP】关于ThinkPHP关联模型和视图模型的一些心得 推荐
- 关于thinkphp中关联模型的简单使用
- Thinkphp3.2.3 解决关联模型的自动生成问题($_auto)
- ThinkPHP-模型关联-效率
- EntityFramework 关于实体模型自关联问题
- 关于thinkphp关联模型的HAS_ONE
- 心得体会:关于开发效率和项目周期的问题
- 关于box(盒模型)的一系列问题
- 关于for循环的累加效率问题(java)
- “提高一下dotnet程序的效率一”中关于exception的问题
- 关于3DSMAX模型导入SL的问题
- 关于i++ 和 ++i在C++中的效率问题(转载)
- 关于开发效率和项目周期的问题(转)
- 关于不同sql语句执行效率的问题
- 关于使用System.out.println()向控制台输出数据和使用out.println()向页面输出数据效率的问题
- 心得体会:关于开发效率和项目周期的问题
- 关于代码运行效率问题的一个总结和一点疑问