问题:
最近遇到的一个问题,有一个查看订单记录的接口,在生产和预生产测试接口响应速度都是毫秒级别的速度,但是一到生产上接口响应速度需要7~8s,这个接口显然是不能使用的需要优化。
分析原因:
1.由于该订单接口的SQL关联了硬件信息表和用户的信息表,使用LEFT JOIN 将三张表直接关联起来,这种做法显示是错误,订单表中已经存了数百万条订单记录,多表关联查询会很慢,整个查询可能需要3s左右,因此需要对接口SQL进行改变。
-- 例子SQL与实际业务无关,实际开发,订单表也可以冗余需要的数据
SELECT
o.*, h.*, u.*
FROM
orders o
LEFT JOIN users u ON u.userId = o.userId
LEFT JOIN hardware h ON h.id = o.hardWareId
WHERE
o.userId = '123456789'
-- 上面的SQL可以把某个用户订单先查出来,然后再去关联查询,同时userId字段在订单表中建立索引
SELECT
bb.*, u.*
FROM
(
SELECT
aa.*, h.*
FROM
(
SELECT
o.*
FROM
orders o
WHERE
o.userId = '123456789'
) aa
LEFT JOIN hardware h ON h.id = aa.userId
) bb
LEFT JOIN users u ON u.userId = bb.userId