Php 优化Codeigniter查询

Php 优化Codeigniter查询,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有一个至少有650000条记录的表,并且将增加到15M+条记录。我只是想知道为什么加载一些页面大约需要8-14秒,特别是在搜索时,以及在将页面id(分页)指向最后一页时,考虑到查询非常有限 型号: function fetch_persons($limit, $id, $search, $district = null, $city = null) { if($search) { $this->db->group_start();

我有一个至少有650000条记录的表,并且将增加到15M+条记录。我只是想知道为什么加载一些页面大约需要8-14秒,特别是在搜索时,以及在将
页面id(分页)
指向最后一页时,考虑到查询非常有限

型号:

function fetch_persons($limit, $id, $search, $district = null, $city = null) {

        if($search) {
            $this->db->group_start();
            $this->db->like('persons.fullname', $search, 'after');
            $this->db->group_end();                
        }


        if(!is_null($district)) {
            $this->db->where('persons.district_code', $district);
        }
        if(!is_null($city)) {
            $this->db->where('persons.city_code', $city);
        }
        if(!is_null($barangay)) {
            $this->db->where('persons.brgy_code', $barangay);
        }

         $this->db->select('
            persons.id,
            persons.fullname,
            persons.address,
            persons.sex,                
            persons.deceased,   
            city.name as city,          
            district.name as district,                  
          ');        

        $this->db->join('city', 'city.code = persons.city_code', 'left');
        $this->db->join('district', 'district.code = persons.district_code', 'left');
        $this->db->limit($limit, (($id-1)*$limit));
        $this->db->order_by('persons.id', 'ASC');

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

        if ($query->num_rows() > 0) {
            return $query->result_array();
        }
        return false;

}
我尝试了
$this->db->cache_on()
在执行
搜索
或类似的
时,是否所有数据都得到处理?
以及
限制1006000

有哪些方法可以更好地优化查询


有哪些替代方案

您是否尝试为数据库编制索引?如果您没有这样做,则可以节省大约80%的页面加载时间。

我怀疑您的查询是否存在问题(但我可能错了),而是实际数据库设置效率低下。您的数据库表是否包含您正在搜索或加入的字段的索引?如果禁用一个或多个搜索条件,会有多大区别?使用
LIMIT
解决
LIMIT
问题不会减少处理时间,因为生成结果集所需的所有工作都将在输出结果集之前完成,这就是
LIMIT
通常出现的情况:它限制传输的数据量。这不是codeigniter的问题,而是MySQL的问题。由于缺少或误用索引,您很可能正在进行一次或多次完整扫描。如果看不到你的桌子结构就很难找出凶手,但是对查询运行
EXPLAIN
将有助于了解下一步,首先-在查询之前进行解释,检查索引的使用情况-然后用这些信息更新您的问题,并包括您的表结构和索引-用这么少的信息回答这样的问题是不可能的信息…请在主字段和在where子句中使用它的上添加索引。另外,请保密您的桌子结构,以便我们提供更好的视觉效果。