來點直接的,業務需求: 一張業務員表 一張賬戶表,然後聯表查詢。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的結果如下: