数据库规范之SQL规范写法

1.原始sql

点击(此处)折叠或打开

  1. SELECT count(0)
  2. FROM (
  3.     SELECT id, merchant_no, transfer_no, transfer_mode, bank_code
  4.         , account_no, province_by, citiy_by, amount, actual_amount
  5.         , account_name, fee, cost, status, channel_id
  6.         , channel_no, channel_merchan_no, transfer_serial_no, remark, check_status
  7.         , check_date, create_date, del_flag, trade_type, cost_type
  8.         , flag, tm_smp, subbranch
  9.         , (
  10.             SELECT state
  11.             FROM t_trade_remit_order
  12.             WHERE order_no = transfer_no
  13.         ) AS state
  14.     FROM t_mer_transfer
  15. ) t
  16. WHERE status = '02'
  17.     AND create_date >= '2018-06-16 00:00:00'
  18.     AND create_date <= '2018-06-16 23:59:59'
改写之后

点击(此处)折叠或打开

  1. SELECT count(*) from
  2. t_mer_transfer
  3. WHERE status = '02' and AND create_date >= '2018-06-16 00:00:00'
      AND create_date <= '2018-06-16 23:59:59'
改写到这里,是不是结束了呢?不是,看一下索引,发现在state字段有个btree索引。不当的索引,拖慢查询。删除掉

点击(此处)折叠或打开

  1. SELECT trade_serial_no, order_amount, channel_poundage
  2. FROM t_chk_plat_bill
  3. WHERE batch_no = '216201806231006071980000000003'
  4.     AND RIGHT(trade_serial_no, 5) % '15' = '3'
RIGHT (trade_serial_no , 5 ) % '15' = '3' 无法使用索引。t_chk_plat_bill有203万数据,建议加索引在batch_no上面。



附上索引知识

BTree索引

BTree(多路搜索树,并不是二叉的)是一种常见的数据结构。

不适合:

  • 单列索引的列不能包含null的记录,复合索引的各个列不能包含同时为null的记录,否则会全表扫描;索引失效很多时候是因为这列有null,空值
  • 不适合键值较少的列(重复数据较多的列);假如你建立了,会发生什么情况呢?查询反而会变慢
  • 前导模糊查询不能利用索引(like '%XX'或者like '%XX%'),该类sql语句导致索引失效

Hash散列索引

Hash散列索引是根据HASH算法来构建的索引。

适合:

  • 精确查找非常快(包括= <> 和in),其检索效率非常高,索引的检索可以一次定位,不像BTree 索引需要从根节点到枝节点,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

不适合:

  • 不适合模糊查询和范围查询(包括like,>,<,between……and等),由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样;
  • 不适合排序,数据库无法利用索引的数据来提升排序性能,同样是因为Hash值的大小不确定;
  • 复合索引不能利用部分索引字段查询,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
  • 同样不适合键值较少的列(重复值较多的列);

Bitmap位图索引

 就是用位图表示的索引,对列的每个键值建立一个位图。相对于BTree索引,占用的空间非常小,创建和使用非常快。位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。

适合

  • 适合决策支持系统;
  • 当select count(XX) 时,可以直接访问索引中一个位图就快速得出统计数据;
  • 当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据。

不适合

  • 不适合键值较多的列(重复值较少的列);
  • 不适合update、insert、delete频繁的列,代价很高。到底是什么代价呢?update,insert,delete的时候会锁住键值一样的行。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30393770/viewspace-2156553/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30393770/viewspace-2156553/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值