关于thinkphp关联模型的效率问题

来源:互联网 发布:unity linux 运行效率 编辑:程序博客网 时间:2024/05/19 16:50

以前听说过thinkphp关联模型效率比较低,但是一直没去看源代码,(现在也没看),今天写rbac的时候才感觉到

三个表及其相关字段如下:

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你可以更灵活,而且可以自行优化,好处多多。



0 0
原创粉丝点击