問題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條記錄,所以處理耗時非常少
大塊的時間還是損耗在構造臨時表和排序上,但是這個時間必須得損失