您的位置:首页 > 编程语言 > PHP开发

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

2014-08-22 15:45 441 查看
以前听说过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你可以更灵活,而且可以自行优化,好处多多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: