数据库索引使用的关键

•数据库查询添加上索引就会加快查询速度?

不一定!!!

•加上不当的索引会加慢查询速度
我在开发中遇到的问题描述如下:
做一个查询系统,统计北京市201611和201612两个月账期内的换机数,数据库里面这张换机表中有1600万的全国2个月的换机数据,页面需要统计2个月中换机最多的top品牌,以及这些品牌的top3换入机型和top3换出机型。使用的是postgres数据库,数据库的内存是64g(由于会涉及到io问题,这个内存必须说明)。测试前,数据库表中建立“账期、省份、品牌”索引,整个前端页面刷新需要2分04秒。之后把索引去掉,耗时1分44秒。下面是页面中某条sql的执行情况。

不加索引之前


加索引之后


那么,上述问题是怎么导致的呢?为什么建立索引的耗时比不建索引的耗时时间长呢?

这个原因有很多,但最主要的是因为建立了错误的索引。

上述建立的索引是“账期、省份、品牌”,但是数据在hive端加工的结果表是按照账期、省分区的,所以导入pg数据库时一个省的数据连续插入。

所以在pg数据库中,同一个省的数据大多数存储在磁盘时都是连续的,所以如果先按照账期索引的话,得到的数据就是离散的,接着再按照账期和品牌索引的话就会造成数据在内存中的多次换入换出(按照100w数据消耗10g内存来估算,数据超过500w就会引起io的换入换出)。

修改索引为“省份、品牌、账期”之后,由于先索引省份,所以索引的结果在磁盘上是连续存储的,那么数据量就减下来了,数据不超过500w,不会引起IO频繁的换入换出,接下来再按照品牌、账期索引就可以很快找到数据,从而快速得到结果。

修改索引后,我的页面刷新大概2秒左右,比建立不正确的索引快了60多倍。
















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值