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概述
MySQL SQL概述 数据库的好处: •实现数据持久化 •使用完整的管理系统统一管理易 数据库的概念: DB:数据库(database):存储数据的“仓库”.它保存了一系列有组织的数据. DBMS: ...
- golang复杂数据结构
1.数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.因为数组的长度是固定的,因此在Go语言中很少直接使用数组. 数组的每个元素可以通过索引下标来访问,索引下标的范 ...
- OpenGL学习日志(2020.4之前)
咳咳,原本这个日志是本机上随便写的一些记录,也没怎么注意可读性和格式,有用信息密度很小,所以实用价值并不大.暂时由于不可抗因素得先鸽一段落了... 后续的日志会升格为模块化的学习记录,(应该)将会有很 ...
- java项目的心得,java项目的代码层次的架构划分
java项目使用的架构是ssm(Spring+SpringMVC+MyBatis). 一.后台代码一般分三层,Controller,Service,Dao. 1.Controller层是对前端或者接口 ...
- 浅谈python垃圾回收机制
引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那 ...
- 使用script打开页面
<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html" ...
- Android开发之SDCardUtils工具类。java工具详细代码,附源代码。判断SD卡是否挂载等功能
package com.xiaobing.zhbj.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputSt ...
- SSD-Tensorflow 512x512 训练配置
搞了几天终于把这个给搞得差不多了,遇到的错误这里也记录一下: 一.配置[配置什么的300和512其实差不多,这里只举一个例子来分析一下] 之前的文件修改什么的和300x300的一样:https://w ...
- Python基本
Python基本规则 1.面向对象的跨平台的编程语言 2.文件类型是.py, 3.一个文件是一个模块module,运行整个文件 4.不支持非英文字符,区分大小写 5.一行是一条语句,多条语句写一行用; ...
- cometoj(A-D+F+H)代码
A #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> ...