来点直接的,业务需求: 一张业务员表 一张账户表,然后联表查询。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。
解决这个问题的方法,就是把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的结果如下: