天天看点

记录一次mysql的优化

来点直接的,业务需求: 一张业务员表 一张账户表,然后联表查询。sql如下:

EXPLAIN SELECT b.id AS businessId,b.name AS businessName,b.status AS business_status,b.company_code AS companyCode,b.mobile AS businessMobile,a.id AS accountId,

a.remnant AS remnant FROM t_business_man b

LEFT JOIN t_account a

ON b.id = a.owner_id

WHERE a.owner_type ='business'

AND a.type='default'

ORDER BY b.id DESC

直接结果:我们看到,虽然我们建立了联合索引,在type上符合要求,但是由于order by的存在,出现了Using temporary; Using filesort。

记录一次mysql的优化

解决这个问题的方法,就是把order by 放入到b表查询中,再和a表进行联合查询,sql如下:

EXPLAIN

SELECT h.*,k.* FROM

(SELECT b.id AS businessId,b.name AS businessName,b.status AS business_status,b.company_code AS companyCode,b.mobile AS businessMobile FROM t_business_man b

ORDER BY b.id DESC) h

,(SELECT a.id,a.owner_id,a.owner_type,a.type,

a.remnant FROM t_account a WHERE a.owner_type ='business'

AND a.type='default' ) k

WHERE h.businessId = k.owner_id

此时,EXPLAIN的结果如下:

记录一次mysql的优化