關於thinkphp關聯模型的效率問題

以前聽說過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變得陌生,這就變相的使你的能力變弱。簡單的curd操作可以使用curd,稍微複雜點的就應該自己寫了,使用sql你可以更靈活,而且可以自行優化,好處多多。

所以個人覺得最佳辦法就是:簡單的增刪改查用orm提供的現成的方法,更復雜的在orm裏面執行sql語句,這樣不僅能寫出複雜高效的數據庫執行,也能使用orm對象。


本人出於個人興趣,創建了一個個人公衆號,每天篩選國外網友發現的有趣的事情推送到公衆號,歡迎關注!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章