一、SQL優化
- 盡量用到索引
- 盡量不要使用distinct語法
- 列裁剪,只有需要用到的列才進行輸出
- 盡早過濾數據,減少每個階段的數據量
- join時,盡量把小表放在前面,大表放后面
- 盡量不要用order by
1、盡量用到索引
select * from character_login
應改成:
select * from character_login where dt='20210312'
select a.* from a join b
on a.dt='20210312' and a.dt=b.dt and a.id=b.id
"a.dt=b.dt"是關聯條件,索引沒有起作用。應改成:
select a.* from a join b
on a.dt='20210312' and b.dt='20210312' and a.id=b.id
2、盡量不使用distinct(尤其是大數據量下)
因為Distinct函數都會導致對最終結果集完成一次排序,因此,這就成為成本最昂貴的排序之一.
select distinct id from character_login where dt='20210312'
應改成:
select id from character_login
where dt='20210312'
group by id
select game_id,count(distinct character_id)
from character_login
where dt='20210312'
group by game_id
應改成:
select game_id,count(1)
from
(
select game_id,character_id
from character_login
where dt='20210312'
group by game_id,character_id
)
group by game_id
3、列裁剪
查詢時只有需要用到的列才進行輸出。
原因:
在大數據量多字段的數據表中,如果使用 SELECT * 方式去查詢數據,會造成很多無效數據的處理,會占用程序資源,造成資源的浪費。
4、謂詞下推,盡早進行數據過濾
5、Join順序
小表在前,大表在后
6、如無必要,別用order by(尤其大數據量下)
小表在前,大表在后