laravel + mysql 表数据在几十万,查询使用平率非常高

每次查询需要话费一秒多,并发高就会很卡有什么办法优化吗
下单,商品外卖

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 62

不使用数据库,直接发短信,把并发压力给到移动或者电信

1年前 评论
lijizheng (楼主) 1年前
lijizheng (楼主) 1年前
魔王 1年前
李小明 1年前
杨柳岸 1年前

不使用数据库,直接发短信,把并发压力给到移动或者电信

1年前 评论
lijizheng (楼主) 1年前
lijizheng (楼主) 1年前
魔王 1年前
李小明 1年前
杨柳岸 1年前

升配置,例如polardb 优化查询,看索引,看是否可以限制翻页

1年前 评论
lijizheng (楼主) 1年前

考虑下es?或者详细说下目前的表结构 以及搜索场景 不太明白现在是卡在哪里

1年前 评论

优化业务逻辑和sql吧,才几十万数据对mysql只是洒洒水

1年前 评论
lijizheng (楼主) 1年前
还不出来 1年前
hhhzzz 1年前

你的看你的业务瓶颈是什么 就单说查询速度1秒, 加索引,索引是否失效,sql是否合理,慢查询日志查看, 多主多从,还是服务器io有问题。 也可上es ,redis

1年前 评论

读写分离啊

1年前 评论
半人间 1年前

放一下你的表结构和 SQL?

才几十万。。感觉 SQLite 都能查得很快

1年前 评论

性能优化方向有很多

  1. 优化数据库
  2. 优化 php 代码,添加缓存服务,如 redis,memcache等
  3. 优化 linux ,ulimit -h,还有其他参数
  4. nginx 优化
  5. laravel 优化,看最后链接,应该还有其他的
  6. 添加其他必要的东西,如 es 搜索等
  7. 网络优化(一般不是这个瓶颈) x. 提升服务器配置,网速(花钱)

翻译:Laravel 8 性能优化自查清单

1年前 评论

首先要找出是什么原因导致的?

  1. 本身环境如何配置的配置,有没有开opcache、php-fpm怎么配置的、看看php-fpm慢日志、laravel有没有做优化
  2. 查看mysql慢日志、分析sql 建立合理索引、一次接口多少mysql query
  3. 分析业务 能异步就异步 能缓存就缓存

数据才几十万而已 都是互联网中的毛毛雨 :joy:

1年前 评论
lijizheng (楼主) 1年前
lijizheng (楼主) 1年前
wxf666 1年前
putyy (作者) 1年前
WhiteDragon 1年前
lijizheng (楼主) 1年前

laravel卡还是sql卡,不应该分开测测吗

1年前 评论
lijizheng (楼主) 1年前

表结构 不放 sql也不放 能解决了问题才怪

1年前 评论

Talk is cheap.Show me your code

1年前 评论

$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();
1年前 评论
lijizheng (作者) (楼主) 1年前
wxf666 1年前

几十万放redis里优先读redis . 或者mysql读写分离 读多写少场景

laravel层面io开销就先开个opcache

1年前 评论
wxf666 1年前

根据表结构,业务情况,用es关键字搜索,redis部分缓存,电商有时候是他奶的要显示各种数据关联/统计太深了,可以与后端集合加业务事件与redis缓存来减少数据库查询,因为还是有很多数据更新频率有那么高的,或者有更新的时候加入队列支更新缓存。对于那些数字,晚几秒显示影响没啥的

1年前 评论
wxf666 1年前

用阿里云数据库,或者其他云数据库,不要自己搭建。

1年前 评论
lijizheng (楼主) 1年前

那就上笨办法,主从数据库,你应该是读多,这样,当高负载到来时,你随机从不同的从库读取,这样会快。
另外,少关联表,关联表越多越慢。

再不行就分库分表,或者前面几位说的用es,也行。
办法太多了。
redis不推荐,因为数据太多,且改数据麻烦。

1年前 评论
lijizheng (楼主) 1年前
lijizheng (楼主) 1年前

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;

1年前 评论
lijizheng (作者) (楼主) 1年前
wxf666 1年前

每条 sql 都 explain

1年前 评论

explain吧 一个小建议 where 结果集少的可以放前面 (Oracle采用自下而上的顺序解析WHERE子句)

1年前 评论

我觉得吧 如果是模型关联 他一定走的 wherein wherein的数据多了 一定会卡 可以考虑join 放弃部分的模型便利 join的效率 你这个关联下的子关联在分出两条语句 多次查询库 效率会更高一点

1年前 评论

关联太多,还不如一条一条分开查询

1年前 评论
lijizheng (楼主) 1年前
kebenxiaoming (作者) 1年前

@wxf666 贴一下你的代码我学习一下

1年前 评论
wxf666 1年前
wxf666 1年前
wxf666 1年前
lijizheng (作者) (楼主) 1年前

几十万这么卡明显有问题,第一步先优化索引吧。

1年前 评论
lijizheng (楼主) 1年前
M1racle (作者) 1年前
lijizheng (楼主) 1年前
bishi123 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!