SQL总结
2021-03-13 本文已影响0人
进击的小猴子2
一、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、谓词下推,尽早进行数据过滤
![](https://img.haomeiwen.com/i11099137/35c3566306208097.png)
![](https://img.haomeiwen.com/i11099137/67c8cd8d8627056b.png)
5、Join顺序
小表在前,大表在后
6、如无必要,别用order by(尤其大数据量下)
小表在前,大表在后