Codeigniter:常见功能。 vs多个功能。数据库查询性能

时间:2016-10-12 14:43:45

标签: php mysql database performance codeigniter

我希望根据Codeigniter的经验和知识得到答案。 假设我在数据库中有10个表,我想在同一个控制器中同时查询10个表中的所有行。 有两种方法可以做到这一点,

案例01 - 使用如下的常见查询功能

控制器

sample_function(){
    'table1_data'        => $this->common_model->get_table( 'table1' ),
    'table2_data'        => $this->common_model->get_table( 'table2' ),
    ...
    'table9_data'        => $this->common_model->get_table( 'table9' ),
    'table10_data'        => $this->common_model->get_table( 'table10' )
}

然后在common_model

function get_table( $table_name ){
    $this->db->select()->from( $table_name );
    $sql_stmt = $this->db->get();
    return $sql_stmt->result();
}

所以在这种情况下,get_table( $table_name )将运行10次。

案例02 - 为下面的每个10个表使用单独的函数,

控制器

sample_function(){
    'table1_data'        => $this->common_model->get_table1(),
    'table2_data'        => $this->common_model->get_table2(),
    ...
    'table9_data'        => $this->common_model->get_table9(),
    'table10_data'        => $this->common_model->get_table10()
}

这样common_model将是这样的,这里我们有10个函数不像在Case01中使用相同的函数

function get_table1()
{
    $this->db->select()->from( 'table1' );
    $sql_stmt = $this->db->get();
    return $sql_stmt->result();
}
function get_table2()
{
    $this->db->select()->from( 'table2' );
    $sql_stmt = $this->db->get();
    return $sql_stmt->result();
}
....
function get_table9()
{
    $this->db->select()->from( 'table9' );
    $sql_stmt = $this->db->get();
    return $sql_stmt->result();
}
function get_table10()
{
    $this->db->select()->from( 'table10' );
    $sql_stmt = $this->db->get();
    return $sql_stmt->result();
}

在这种情况下,10个单独的函数分别运行一次。

很明显,当我们考虑代码可用性时,Case 01是最好的,但是当我们考虑性能时,我的静止是

  1. Codeigniter中哪一个是最好的案例?

  2. 说到案例01,get_table会同时运行还是一次运行?

  3. 这种情况最适合CI的表现吗?

  4. Thnaks

2 个答案:

答案 0 :(得分:2)

基于多年后端开发经验的猜测:两者都会同样快/慢地运行,具体取决于您在表中有多少行。

由于您已经拥有代码,只需尝试使用合适的基准测试。让这两个例程运行几千次并取平均值。

答案 1 :(得分:1)

  
      
  1. Codeigniter中哪一个是最好的案例?
  2.   

第一种情况是最好的CI或任何其他情况,因为第二种情况是重复自己的完美例子。干嘛 - D on R epeat Y 我们自己。

  
      
  1. 说到案例01,get_table会同时运行还是一次运行?
  2.   

一次一个。

  
      
  1. 这种情况对CI的表现最好吗?
  2.   

@Joshua回答 - 这取决于桌子的大小。

以下内容并非真正的要求,但我无法自拔。 您可以使您的代码更简洁,更有效。

考虑这个sample_function()

public sample_function()
{
    $data = array();
    foreach(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) as $n)
    {
        $table = "table".$n;
        $data[$table."_data"] = $this->common_model->get_table($table);
    }
    return $data;
}

一小段代码返回一个包含表结果的漂亮数组。这是干的。

不使用查询生成器(QB)可以改进您的模型。 QB在某些情况下很方便 - 但不是在你出现的情况下。 QB对于这样一个简单的查询来说太过分了。使用QB意味着您执行大量代码,最终(并且几乎字面上)相当于$this->db->query('YOUR QUERY HERE');

考虑这个版本的get_table

function get_table($table_name)
{
    $query = $this->db->query("select * from $table_name");
    return $query->num_rows() > 0 ? $query->result() : NULL;
}

不可否认,这是对这种简单查询的“微优化”。但是,IMO更容易编写和阅读。