You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP与SQL数据查询性能对比:Laravel项目中哪种方式更高效?

结论:数据库端SQL搜索(方式一)远优于PHP端过滤(方式二)

直接给出结论:只要你的数据表数据量超过几十条,优先用方式一通过SQL在数据库内部完成搜索和分页,核心原因如下:

1. 数据传输与内存开销差异巨大

  • 方式一:通过where条件过滤+paginate(),数据库仅返回符合搜索条件的分页数据(比如每页15条),数据传输量和PHP内存占用极小。
  • 方式二:Model::all()会把整张表的所有数据加载到PHP内存中,哪怕你最终只需要10条符合条件的数据。如果表有几万、几十万条数据,直接会导致PHP内存耗尽或者响应超时。

2. 数据库的原生优化能力是PHP无法比拟的

数据库天生为数据检索设计:

  • 只要给搜索字段添加索引,数据库能通过索引快速定位符合条件的数据,无需遍历全表。
  • 数据库自带查询优化器,会自动选择最优执行计划;而PHP的filter只能逐条遍历内存中的数据,数据量越大,效率差距越夸张。

3. 分页逻辑的合理性

方式一的paginate()是在数据库层面完成分页(依赖LIMIT/OFFSET),返回的就是当前页所需数据;而方式二如果要实现分页,必须先加载全表数据到内存,过滤后再手动切割分页,完全是本末倒置。

代码示例对比

推荐的方式一实现(带搜索条件)

// 把搜索条件整合到SQL查询中,利用数据库索引提升效率
$search = request('search');
$result = Model::where('title', 'like', "%{$search}%")
    ->with('category') // 预加载关联模型,避免N+1查询
    ->paginate(15);

不推荐的方式二实现(仅适合极小数据量)

// 仅当表数据量不足100条时,性能差异可忽略,但依然不推荐
$search = request('search');
$allItems = Model::all();
$filteredItems = $allItems->filter(function ($item) use ($search) {
    return str_contains($item->title, $search);
});
// 手动处理分页:
$paginatedItems = $filteredItems->forPage(request('page', 1), 15);

例外情况

如果你的数据表固定只有几十条数据,两种写法的性能差异几乎可以忽略,但从代码规范和可扩展性角度,还是建议用方式一——哪天数据量增长,无需修改代码也能正常运行。

内容的提问来源于stack exchange,提问作者Ebrahim Bashirpour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:10:51