三張關聯表,大表;單次查詢耗時400s,有group by order by 如何優化


問題SQL:

select

p.person_id as personId,

p.person_name as personName,

p.native_place as nativePlace,

ci.company_name as companyName,

pp.seal_number as sealNumber,

GROUP_CONCAT(pp.major) as major,

pp.register_name as registerName

from qyt_person p

left join qyt_person_practising pp on p.person_id=pp.person_id

left join qyt_company_info ci on p.company_id=ci.company_id

group by p.person_id,pp.register_name

order by p.create_time desc

limit 1,10

 

 

SQL總耗時393秒,通過Explain分析,發現為200萬數據的表建立了臨時表,且做了一次排序操作

 

 

通過查看SQL運行分析,也看出來,構造臨時表耗時106秒,排序用了285秒(沒索引的排序慢)

 

 

 

解決思路:根據業務需求再次審視如何減少數據量

1、業務需求:最新人員可以先取出來10名

2、取出來后再關聯查詢他們所在企業,所獲證書(有索引,查詢快)

3、這種小的臨時表排序的耗時就可以接受了

4、SQL語句有子查詢功能,可以把200萬的表數據縮減為10人的小表

 

SQL語句如下:

select

p.person_id as personId,

p.person_name as personName,

p.native_place as nativePlace,

p.create_time as createTime,

ci.company_name as companyName,

pp.seal_number as sealNumber,

GROUP_CONCAT(pp.major) as major,

pp.register_name as registerName

from (SELECT person_id, person_name, native_place,company_id ,create_time from qyt_person order by create_time desc limit 0,10) p

left join qyt_person_practising pp on p.person_id=pp.person_id

left join qyt_company_info ci on p.company_id=ci.company_id

group by p.person_id,pp.register_name

ORDER BY p.create_time desc

limit 0,10

 

結果完美!響應時間為0.017秒

通過Explain分析,臨時表就10條記錄,所以處理耗時非常少

 

大塊的時間還是損耗在構造臨時表和排序上,但是這個時間必須得損失

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM