CodeIgniter 计数太慢 - 分页

Posted

技术标签:

【中文标题】CodeIgniter 计数太慢 - 分页【英文标题】:CodeIgniter count too slow - pagination 【发布时间】:2017-02-07 16:13:12 【问题描述】:

我正在尝试使用 CodeIgniter 更快地进行搜索。我使用分页库,我必须在包含超过 120 万条记录的表上计算从查询返回的记录。 num_rows() 函数非常慢(大约需要 3 秒)

public function search()

    $this->output->enable_profiler(TRUE);
    
    $data = array();
    
    $query = $this->input->get('query');
    $filter = $this->input->get('f');
    $hd = $this->input->get('hd');

    if($hd == 'true'):
        $this->db->where('hd',1);
    endif;

    $request = urldecode($query);
    
    $where = "MATCH (name,tags) AGAINST ('".$request."' IN BOOLEAN MODE)";
    $this->db->where($where);   

    $get_vars = $this->input->get();

    if(is_array($get_vars) && ($this->input->get('query')) ):
        $config['suffix'] = '?'.http_build_query($get_vars,'', '&');
    endif;

    $config['base_url'] = base_url('search');
    $config['per_page'] =  8;
    $config['num_links'] = 8;
    $config['full_tag_open'] = '<div class="pagination"><ul>';
    $config['full_tag_close'] = '</ul></div><!--pagination-->';
    $config['first_link'] = '&laquo; First';
    $config['first_tag_open'] = '<li class="prev page">';
    $config['first_tag_close'] = '</li>';
    $config['last_link'] = 'Last &raquo;';
    $config['last_tag_open'] = '<li class="next page">';
    $config['last_tag_close'] = '</li>';
    $config['next_link'] = 'Suivant &rarr;';
    $config['next_tag_open'] = '<li class="next page">';
    $config['next_tag_close'] = '</li>';
    $config['prev_link'] = '&larr; Précédent';
    $config['prev_tag_open'] = '<li class="prev page">';
    $config['prev_tag_close'] = '</li>';
    $config['cur_tag_open'] = '<li class="active"><a href="">';
    $config['cur_tag_close'] = '</a></li>';
    $config['num_tag_open'] = '<li class="page">';
    $config['num_tag_close'] = '</li>';
    
    $query = clone $this->db;
    $config['total_rows'] = $query->get('videos')->num_rows();      
    $config['segment'] = $this->uri->segment(2);
    $this->pagination->initialize($config);

    $data['results'] = $this->db->get('videos',$config['per_page'],$this->uri->segment(2))->result();

    $this->load->view('search',$data);

有什么解决办法吗?

【问题讨论】:

***.com/questions/12864557/… 你可以直接获取数据,放入表格,使用js分页。 num_rows() 可能会从数据库中提取每条记录,并在结果集上使用 phpcount() 函数。您可以做的最有效的事情是运行专用的select count(*) as total_videos from videos 查询并使用该值。 @JamesLalor 这听起来像是一个让事情变得更糟的可靠想法...... @MonkeyZeus 关于 JamesLalor 哈哈哈 【参考方案1】:

正如 @MonkeyZeus 的 cmets 所建议的,使用 SQL count() 函数可以提高性能。 Codeigniter 通过 Query Builder 函数 count_all_results($table = '', $reset = TRUE) 提供此功能。

该功能将考虑您设置的任何限制器,例如whereor_wherelike

改变这个

$query = clone $this->db;
$config['total_rows'] = $query->get('videos')->num_rows(); 

到这里

//next line is not needed because the query will not be reset by the row count
//$query = clone $this->db;
$config['total_rows'] = $this->db->count_all_results('videos', FALSE); 

我很想知道执行时间如何变化。

【讨论】:

@VeenZ 您能否对您的查询进行基准测试并缩小哪个查询减慢速度?如果您在正确进行基准测试方面需要帮助,请告诉我。 @VeenZ 不,谢谢,我不使用 Skype。您应该尝试发布一个关于查询优化的新问题,因为您可能需要添加或修复一些索引或重新安排您的查询。

以上是关于CodeIgniter 计数太慢 - 分页的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter 分页 url 页码

如何在codeigniter中执行排序、搜索、分页

如何配置分页codeigniter?

使用 codeigniter 和 jquery 进行 AJAX 分页

Codeigniter 分页链接按降序/倒序排列?

Codeigniter 分页不呈现分页链接