• 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 (子查询)
  • 相关阅读:
    01人月神话阅读笔记
    第一阶段冲刺010
    03构建之法阅读笔记
    第一阶段冲刺09
    第一阶段冲刺08
    第一阶段冲刺07
    第一阶段冲刺06
    08返回一个整数数组中最大子数组的和
    02构建之法阅读笔记
    请给出一个Scala RDD的HelloWorld例子
  • 原文地址:https://www.cnblogs.com/xiaodong520/p/13214441.html
Copyright © 2020-2023  润新知