跳至主要內容

联合查询sql优化

chenkun数据库大约 1 分钟

背景:

最近在改一个老项目,其中使用到框架是mybatis,有一个业务表install_record,代表装机记录,一个accessory代表备件表,一个sys_file代表文件表,业务关系是一个install_record对应多个accessory、以及多个sys_file,在一开始使用的是mybatis的嵌套查询的方式,但此方式有N+1的问题,比如一个装机表对应10个accessory、20个sys_file,则就要查询1+10+20 = 31次数据库,效率是很低的,因此想改成嵌套查询的方式。

1、改造后的语句如下

SELECT xxx   FROM
	ccsx_weibao.install_record ir
	LEFT JOIN ccsx_weibao.install_record_accessory ira ON ira.host_id = ir.id
	LEFT JOIN ccsx.sys_file f ON f.business_type = 1 
	AND f.business_id = ir.id 	LIMIT 0,1000;

install_record表中有8000数据,accessory表20000数据,sys_file 表240000数据,执行sql直接卡死

2、原因分析

数据量其实很小,执行慢的原因是没有索引,使用explain分析sql

explain xxx

image-20220428164618054

可以看到key那一列,只有两个PRIMARY被索引,所以所有用于关联字段加上索引即可,此处给business_idhost_id加上索引就ok了