sql 优化思路,实用sql
优化sql,啥也别想先上索引,join,where,order by,group by 的字段加索引,用那些字段select哪些字段,千万别select * from table,看的真的很难受,加where减小数据集,小表在前大表后,inner jion可以的话不用left jion,减小结果集。 多次使用的数据集可以使用with as 加载到内存中;减少子查询。剩下的就是尽可能减少全表扫描,走索引如:
1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
2.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
3.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
剩下的就是多练,优化sql也就是这个思路,多试试。
对了,设计表的时候字段类型真的不能瞎建,很多不做数据的开发,啥都varchar,气死个人,浪费资源不讲,还会影响查询的效率,尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
实用sql
1.分组后随机取10条
select name from member_data_stc5 GROUP BY "name" ORDER BY random() LIMIT 10;
2.分组取最大(最小)一条 ,row_number按id分组按version排序生成1,2,3,desc为倒序,最大值
SELECT
xtc.id,
xtc."corp_name" AS dwmc,
'20200628104000' AS create_time,
'4' AS dw_type,
NULL AS dw,
xtc."addr" AS dwdz
FROM(
select * from (
select id,version,corp_name,addr,row_number() over(partition by id order by version desc) rn
from core_hive
) t where t.rn <=1) xtc
3.按特殊符号拆分指定列,在拼接。
select
split(id,'-')[0] || split(id,'-')[1] as `id`,
split(id,'-')[2] as `version`,
from t0027_t_szwb_corp
4.翻译 ,转换值,case when then end as
SELECT
s.s_id,
s.s_name,
s.s_sex,
CASE
WHEN s.s_sex = '1' THEN '男'
WHEN s.s_sex = '2' THEN '女'
ELSE '其他'
END as sex,
s.s_age,
s.class_id
FROM
t_b_student s
WHERE
1 = 1
5.把结果集合加载到内存中,加快查询
with 表别名 as (子查询),表别名 as (子查询)