2017-04-16 95 views

回答

1

Activerecord使用常规的SQL查询来执行任何您希望它执行的活动。显然,如果你使用activerecord来代表你的查询,那么它可能会选择一种效率较低的方法来实现,比你想的要好。

这是针对当前所有ORM的标准配置。

但是,原始sql和通过activerecord发出的相同查询将具有相同的性能影响,即使是明智的记忆。

1

如果你的问题是“在下面的例子中第二个需要明显更多的内存?”。

实施例1:

$query = $this->db->query("SELECT `id`,`somefield` FROM `some_table` WHERE `id` = $id Order by `somefield` DESC"); 

实施例2:

$query = $this->db 
      ->select('id, somefield') 
      ->from('some_table') 
      ->where('id, $id) 
      ->order_by('somefield', 'DESC'); 
      ->get(); 

答案是存储器差不显著。还有一些额外的记忆,但在事物的计划中,这并不是很多。

Active Record(自CI v3以来重命名查询生成器)的目的是构建查询语句字符串。活动记录示例将执行更多代码以组装第一个示例中定义的相同语句。在它构造声明之后,它实际上使得第一个例子所做的完全相同的调用。

如果正在加载Active Record类(由数据库配置设置确定),则分配内存以保存该代码,无论您是否使用该代码。

使用Active Record确实需要更多的输入。为什么如果查询很容易用简单的字符串表示?另一方面,在不同的查询语句可能有条件需要(即不同的字段集合,附加或不同的“where”条件,备用排序顺序等)的情况下,Active Record可以使您的生活更容易。例如。

$this->db 
    ->select('id, somefield') 
    ->from('some_table') 
    ->where('id, $id); 

if($need_another_where) 
{ 
    $this->db->where('other_field', $other); 
} 

if($reverse_sort) 
{ 
    $this->db->order_by('somefield', 'DESC'); 
} 
else 
{ 
    $this->db->order_by('somefield', 'ASC'); 
} 

$query = $this->db->get(); 

不可否认,通过有条件地连接字符串可以很容易地重新创建上述示例。但更复杂的情况可能很容易存在。