Laravel Model查询结果的3种存储格式内存占用对比
PHP Laravel框架支持Model查询数据后可以有多种方式返回数据,对新手会造成一些困扰,比如数组Model对象、集合、纯数组
今天从内存占用的角度对比一下3种数据返回方式
按数组Model对象返回数据
- 写法
TestModel::query()->where('field_name', $value)->limit(10)->get()->all();
按集合返回数据
- 写法
TestModel::query()->where('field_name', $value)->limit(10)->get();
按纯数组返回数据
- 写法
TestModel::query()->where('field_name', $value)->limit(10)->get()->toArray();
测试环境
PHP 7.2.28, Docker Compose, MacOS
对比数据
- 按数量分别取10、100、1000、10000行数据来对比
返回格式 | 查询行数 | 查询结果内存占用 |
---|---|---|
Model数组 | 10 | 433.2109K |
array | 10 | 457.5313K |
Collection | 10 | 433.2891K |
Model数组 | 100 | 803.3984K |
array | 100 | 816.4688K |
Collection | 100 | 803.4766K |
Model数组 | 1000 | 4.3761M |
array | 1000 | 4.2790M |
Collection | 1000 | 4.3762M |
Model数组 | 10000 | 40.4700M |
array | 10000 | 39.2743M |
Collection | 10000 | 40.4701M |
结论
- 数据量在100以内时,用Model数组占用内存还更少
- Collection总比Model数组多一点点是因为Collection集合多了一层对象包装存储Model数组,有点鸡肋,所以我很少用这种方式
- Model数组配置IDE辅助提示时开发效率更高,并且内存占用相比纯数组array相差不大,所以建议用Model数组方式
开发建议
从开发效率和维护角度我建议选择Model数组的开发方式
因为在PhpStorm这个IDE中,Model的查询方法中加入注释 @return static[] 就可以有IDE字段辅助
当然前提是在相应Model的注释中加入属性注释 @property,下方给出几个示例
Model @property 示例
/**
* @property int $id 主键ID
* @property string $order_sn 订单号
*/
class OrderInfoModel extends Model
{
protected $table = 'order_info';
public $timestamps = false;
/**
* 查找订单
* @param string $sn
* @return static
*/
public function findBySn($sn)
{
return static::query()->where('order_sn', $sn)->first();
}
/**
* 查找订单列表
* @return static[]
*/
public function findListByPage($page, $pageSize)
{
return static::query()->forPage($page, $pageSize)->get()->all();
}
}
//注意两个方法的 @return 差别
使用方法
- 以一个分页列表接口为例
class OrderController extends Controller
{
public function actionList(Request $request)
{
$page = $request->get('page', 1);
$pageSize = $request->get('size', 10);
$results = [];
$list = OrderInfoModel::singleton()->findListByPage($page, $pageSize);
if ($list) foreach ($list as $item) {
$results[] = ['order_sn' => $item->order_sn]; //在IDE中, 这个$item->order_sn是有辅助提示的,就是Model中的@property起的作用
}
//其他代码省略
}
}
Laravel Model查询结果的3种存储格式内存占用对比的更多相关文章
- Dynamics CRM2016 查询数据的三种方式的性能对比
之前写过一个博客,对非声明验证方式下连接组织服务的两种方式的性能进行了对比,但当时只是对比了实例化组织服务的时间,并没有对查询数据的时间进行对比,那有朋友也在我的博客中留言了反映了查询的时间问题,一直 ...
- SparkSQL查询程序的两种方法,及其对比
import包: import org.apache.spark.{SparkConf, SparkContext}import org.apache.spark.rdd.RDDimport org. ...
- PHP查询MySQL大量数据的内存占用分析
这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及. 昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于M ...
- php – Laravel 5查询关系导致“调用成员函数addEagerConstraints()on null”错误( 转载)
php – Laravel 5查询关系导致“调用成员函数addEagerConstraints()on null”错误 我一直在尝试创建一个简单的用户管理系统,但在查询关系时不断遇到障碍.例如,我 ...
- python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)
一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...
- Yii Ar model 查询
Ar model 查询 参照表: CREATE TABLE tbl_user ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, username VA ...
- Hibernate 查询MatchMode的四种模式
Hibernate 查询MatchMode的四种模式 MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最 ...
- 查询分页的几种Sql写法
查询分页的几种Sql写法 摘自:http://www.cnblogs.com/zcttxs/archive/2012/04/01/2429151.html 1.创建测试环境,(插入100万条数据大概耗 ...
- laravel数据库查询返回的数据形式
版本:laravel5.4+ 问题描述:laravel数据库查询返回的数据不是单纯的数组形式,而是数组与类似stdClass Object这种对象的结合体,即使在查询构造器中调用了toArray(), ...
随机推荐
- MySQL最全存储引擎、索引使用及SQL优化的实践
1 MySQL的体系结构概述 整个MySQL Server由以下组成 :Connection Pool :连接池组件Management Services & Utilities :管理服务和 ...
- 从Vessel到二代裸金属容器,云原生的新一波技术浪潮涌向何处?
摘要:云原生大势,深度解读华为云四大容器解决方案如何加速技术产业融合. 云原生,可能是这两年云服务领域最火的词. 相较于传统的应用架构,云原生构建应用简便快捷,部署应用轻松自如.运行应用按需伸缩,是企 ...
- discuz论坛替换logo之后不显示该怎么办
http://www.wocaoseo.com/thread-2-1-1.html 这个虽然不算是seo的问题,但是在平时的操作之中经常性的遇到,常常是我用FTP已经上传替换了原来的logo,但是前台 ...
- Min Cost Climbing Stairs [746]
Min Cost Climbing Stairs [746] 题目描述 简单来说就是:要跳过当前楼梯需要花费当前楼梯所代表的价值cost[i], 花费cost[i]之后,可以选择跳一阶或者两阶楼梯,以 ...
- ZooKeeper的十二连问,你顶得了嘛?
前言 一线大厂ZooKeeper的十二连问,你顶得了嘛? 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 1. 面试官:工作中使用过Zooke ...
- LuaProfiler
Lua Profiler机制的源码解析 https://www.jianshu.com/p/f6606b27e9de
- js 原生功底 (一)
欢迎大家一起学习,点击查看
- Photon Server伺服务器在LoadBalancing的基础上扩展登陆服务
一,如何创建一个Photon Server服务 参见此博客 快速了解和使用Photon Server 二, 让LoadBalancing与自己的服务一起启动 原Photonserver.config文 ...
- [PyTorch 学习笔记] 5.1 TensorBoard 介绍
本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson5/tensorboard_methods.py http ...
- java基础(swing+jsp+mybatis配置)
JAVA SE GUI编程(swing) # 组件 描述 1 JFrame 一个普通的窗口(绝大多数 Swing 图形界面程序使用 JFrame 作为顶层容器) 2 JDialog 对话框 常用的中间 ...