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(), ...
随机推荐
- 归并排序-Python实现
归并排序(MergeSort) 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(n\log n)(大O符号).1945年由约翰·冯·诺 ...
- NumPy笔记-ndarray
ndarray,N维数组对象(矩阵) 所有元素必须是相同类型 ndim属性,维度个数 shape属性,各维度大小 dtype属性,数据类型 创建ndarray np.array(collection) ...
- antdv时间选择a-date-picker设置日期可选范围(近一周、近半月、近一月等) - moment.js
Vue->Template: <a-date-picker v-model="value" :disabled-date="disabledDate" ...
- 从零开始的SpringBoot项目 ( 八 ) 实现基于Token的用户身份验证
1.首先了解一下Token uid: 用户唯一身份标识 time: 当前时间的时间戳 sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接 固定参数(可 ...
- Java面试题(多线程篇)
多线程 35.并行和并发有什么区别? 1.并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 2.并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. 3.在 ...
- Qt 关于图片打开,另存为,保存到指定位置操作
Qt 关于图片打开,另存为,保存到指定位置操作(转载) 在头文件mainwindow.h中先声明以下类: 1 #include <QImage> 2 #include <QPixma ...
- android开发之edittext弹出输入框遮挡住文字。解决方法
在ManiFest清单文件中修改被遮挡的类的EditText android:windowSoftInputMode="adjustPan|stateHidden"
- 游戏UI系统设计
1.需要实现的功能 UI界面的管理(窗体加载.窗体显示.窗体隐藏.窗体销毁等) UI分层次(比如弹窗.广播信息需要在上层) UI界面的出场.入场动画 UI界面的显示效果(比如带透明背景.带高斯模糊背景 ...
- 手写mybatis框架
前言 很久没有更新mybatis的源码解析了,因为最近在将自己所理解的mybatis思想转为实践. 在学习mybatis的源码过程中,根据mybatis的思想自己构建了一个ORM框架 .整个代码都是自 ...
- 深入了解Netty【五】线程模型
引言 不同的线程模型对程序的性能有很大的影响,Netty是建立在Reactor模型的基础上,要搞清Netty的线程模型,需要了解一目前常见线程模型的一些概念. 具体是进程还是线程,是和平台或者编程语言 ...