性能优化方向有很多
- 优化数据库
- 优化 php 代码,添加缓存服务,如 redis,memcache等
- 优化 linux ,ulimit -h,还有其他参数
- nginx 优化
- laravel 优化,看最后链接,应该还有其他的
- 添加其他必要的东西,如 es 搜索等
- 网络优化(一般不是这个瓶颈) x. 提升服务器配置,网速(花钱)
$order = Order::query() ->where('Deleted', false) ->where('StoreGuid', $this->currentStoreGuid) ->where('Guid', $guid)
#->with(['deliveryInfo', 'items.garnish', 'store', 'customer', 'employee'])
->with([
'deliveryInfo',
'orderitemLog'=>function($query2){
$query2->select(
'Guid',
'OrderGuid',
'OrderitemGuid',
'CommodityNo',
'Name',
'Price',
'Quantity',
'Remark',
'updateDel'
);
},
'items'=>function($query){
$query->select(
'Id',
'OrderGuid',
'UpName',
'CommodityGuid',
'Price',
'Quantity',
'CreateTime',
'Guid',
'Deleted',
'SpecificationGuid',
'Seq',
'AttributesGuids',
'AttributesGuidJson',
'Description',
'IsOrderPrint',
'package_ms'
)->orderBy('Id');
},'items.commodity'=>function($query){
$query->select('Guid','Name','No','CategoryGuid','is_people');
},'items.garnish'=>function($query){
$query->orderBy('id');
},
'orderPayItems'=>function($query){
$query->orderBy('Id');
},
'orderPayItems.commodity'=>function($query1){
$query1->select('Guid','Name');
},
'customer'
])
->firstOrFail();
根据表结构,业务情况,用es关键字搜索,redis部分缓存,电商有时候是他奶的要显示各种数据关联/统计太深了,可以与后端集合加业务事件与redis缓存来减少数据库查询,因为还是有很多数据更新频率有那么高的,或者有更新的时候加入队列支更新缓存。对于那些数字,晚几秒显示影响没啥的
CREATE TABLE orderitem
(
Id
int NOT NULL AUTO_INCREMENT,
OrderGuid
varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
CommodityGuid
varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
UpName
varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '菜品名称',
Price
decimal(7,2) DEFAULT NULL,
Quantity
int DEFAULT NULL,
CustomerGuid
varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
EmployeeGuid
varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
CreateTime
datetime DEFAULT NULL,
GroupKey
int DEFAULT NULL,
Guid
varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
Deleted
bit(1) DEFAULT NULL,
SpecificationGuid
varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
Seq
int NOT NULL DEFAULT '0' COMMENT '是否是加菜,0表示不是加菜 1,2,3等表示第一次加菜,第二次加菜等,-1,-2.-3表示店家第1次加菜第二次加菜等',
AttributesGuids
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '属性的名称,逗号分隔',
AttributesGuidJson
varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '属性guid的json数据',
Description
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
Tax
decimal(12,3) NOT NULL DEFAULT '0.000' COMMENT '税',
IsOrderPrint
tinyint NOT NULL DEFAULT '0' COMMENT '菜品是否送厨打印 1是 0否',
package_ms
tinyint NOT NULL DEFAULT '0' COMMENT '套餐单个还是多个 0不是套餐 1单个套餐 2多个套餐',
PRIMARY KEY (Id
),
KEY CommodityGuid
(CommodityGuid
),
KEY OrderGuid
(OrderGuid
)
) ENGINE=InnoDB AUTO_INCREMENT=842455 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
我觉得吧 如果是模型关联 他一定走的 wherein wherein的数据多了 一定会卡 可以考虑join 放弃部分的模型便利 join的效率 你这个关联下的子关联在分出两条语句 多次查询库 效率会更高一点
推荐文章: