天天看點

記錄一次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的優化