大行数表查询失败,仅添加LIMIT限制时可正常获取数据
解决大表移除LIMIT后无法获取数据的问题
可能的原因及对应解决方法
1. PHP内存耗尽
当查询返回大量数据时,result()会一次性把所有结果加载到内存,容易触发PHP内存限制。
- 临时调整内存:在代码开头增加内存限制配置
ini_set('memory_limit', '256M'); // 可根据实际需求调至512M或更高 - 优化查询字段:只获取业务需要的字段,减少内存占用
$this->db->select('PrshId, PrshNama, PrshAlamat'); // 替换为你实际需要的字段 $this->db->where('PrshStatus', 'A'); $this->db->where('PrshJenis', '1'); return $this->db->from('TPerusahaan')->get()->result();
2. 执行超时
大量数据查询可能超出PHP默认的执行时间限制。
- 调整执行时间:
set_time_limit(60); // 设置为60秒,可按需调整
3. 数据库配置限制
部分数据库(如MySQL)的max_allowed_packet参数过小,会导致大量数据无法正常返回。
- 检查并调大数据库配置:联系运维或修改数据库配置文件,提升
max_allowed_packet的值。
4. 改用逐行读取的结果处理方式
CodeIgniter的unbuffered_row()可以逐行读取数据,避免一次性加载全量数据到内存:
$query = $this->db->where('PrshStatus', 'A') ->where('PrshJenis', '1') ->from('TPerusahaan') ->get(); $results = []; while ($row = $query->unbuffered_row()) { $results[] = $row; // 也可在此处直接处理单条数据,无需存储所有结果 } return $results;
5. 前端/客户端处理瓶颈
如果是返回前端后无法展示,大概率是前端无法处理海量数据,建议后端做分页处理:
$page = $this->input->get('page', true) ?: 1; $perPage = 50; $offset = ($page - 1) * $perPage; $this->db->where('PrshStatus', 'A'); $this->db->where('PrshJenis', '1'); $this->db->limit($perPage, $offset); return [ 'data' => $this->db->from('TPerusahaan')->get()->result(), 'total' => $this->db->count_all_results('TPerusahaan', false) // false避免重置查询条件 ];
内容的提问来源于stack exchange,提问作者yehuda satrio
相关产品推荐
相关产品推荐

