业务场景:
由于我们的是订单系统,每天产生的订单也特别的大,造成后台查询订单的时候特别慢,存在一个深页查询的问题,现在后台管理页面查询近一个月订单的时候将近10s左右
问题分析:
针对上面的问题,看了一下发现目前的后台订单查询sql,每一次查询,不管是翻页和不翻页都会把所有的数据查询出来,但其实后台管理页面只展示10条数据,根据不需要每次查询出所有数据返回给前端,这是一个主要问题,其次查询sql也可以进行一个优化,没有使用索引,也没有限制每次查询的数据量
解决方案:
因为前端会传入查询的开始时间和结束时间,所以我们这里先根据前端传入的开始时间-1天查询出这一天最大的数据Id主键值,然后通过这个Id主键查询大于这个id的数据作为主要查询条件并且对查询的数据进行一个limit限制每次查询的数量,这样就可以利用走主键索引查询并且对数据进行一个数据量限制
具体sql:
这条sql主要是查询出本次查询的主键id从哪个id开始查 :select max(id) from tb_order_order o where o.create_time <= 查询开始时间的前一天
完整sql:SELECT
o.*,
u.unique_id,
t.`name` AS tenantName,
r.pay_no AS payNo,
r.transaction_id AS transactionId,
r.pay_item_value AS payItemValue,
r.pay_time_text AS payItemText
FROM
tb_order_order o
LEFT JOIN tb_member_user u ON o.user_id = u.id
AND o.tenant_id = u.tenant_id
AND u.is_deleted = 0
LEFT JOIN tb_member_tenant t ON o.tenant_id = t.id
LEFT JOIN tb_order_pay_record r ON o.partner_order_number = r.partner_order_number
WHERE
1 = 1
AND o.id > 1388918
AND o.`category` = 'member'
AND o.`create_time` >= '2023-08-28 00:00:00'
AND o.`create_time` <= '2023-09-27 23:59:59'
AND o.is_deleted = 0
ORDER BY
o.`create_time` DESC
LIMIT 40,10
这里的limit值是根据查询的页数来定的,这样查询1s左右就查出来了,足足优化了10倍的速度。
然后这里查询出来当页展示的数据之后,我们还得把数据的总量查询出来