问题:
最近遇到的一个问题,有一个查看订单记录的接口,在生产和预生产测试接口响应速度都是毫秒级别的速度,但是一到生产上接口响应速度需要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
2.使用SQL去查询在几百万的数据量查询只需要0.03s左右,但是实际接口还是需要7~8左右才能够返回数据,这时候考虑到是不是因为MyBatis-Plus分页的问题,关闭分页查询,发现并不是这个原因。
3.在控制台查看其生成的SQL发现传参数使用的Long的参数类型,而在数据库userId的字段类型为varchar,拼接好SQL后,使用Long类型的去查询确实会导致整个SQL变慢,因为可以定位到问题,是由于传参类型与实际字段参数不一致,导致索引失效。
相关链接:
mybatis-plus框架分页导致的SQL过慢优化_qq_35824259的博客-CSDN博客_mybatis-plus分页查询很慢
版权声明:本文为NiKaBoy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。