使用MyBatis-Plus 导致接口响应变慢的原因分析

问题:

最近遇到的一个问题,有一个查看订单记录的接口,在生产和预生产测试接口响应速度都是毫秒级别的速度,但是一到生产上接口响应速度需要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

mybatis-plus框架分页导致的SQL过慢优化_qq_35824259的博客-CSDN博客_mybatis-plus分页查询很慢

你可能感兴趣的:(mybatis,sql,数据库,mysql,java)