常规MYSQL查询比Codeigniter活动记录查询更快吗?在某些地方,我读到活动记录查询需要内存来执行查询,但不是常规。
由于
答案 0 :(得分:1)
Activerecord使用常规SQL查询来执行您希望它执行的任何活动。显然,如果您使用activerecord代表您组装查询,那么它可能会选择一种效率较低的方式,而不是您自己。
这是针对所有当前ORM的标准con。
但是,与原始sql和activerecord发出的相同查询即使在内存方面也会产生相同的性能影响。
答案 1 :(得分: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以来重命名为Query Builder)的目的是构建查询语句字符串。 Active Record示例将执行更多代码以组装第一个示例中定义的相同语句。在构造语句之后,它实际上与第一个示例进行完全相同的调用。
如果正在加载Active Record类(由数据库配置设置确定),则分配内存以保存该代码,无论您是否使用它。
使用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();
不可否认,上述示例可以通过有条件地连接字符串来轻松地重新创建。但是更复杂的情况很容易存在。