动态索引创建器

此文转载自我的Git:https://github.com/aiyanbo/sliner/wiki/Dynamic-Index-Generator


动态索引创建器

======


动态索引创建器是指:根据收集到的用户过滤器(查询条件),分析已有的数据分布情况,找到一条最佳索引路径,然后创建最佳索引;同时,回收已经过时的索引(不再是最佳路径的索引)。


组成部分
======


 - 记录用户的过滤习惯
 - 分析数据的分布情况
 - 分拣,排序可索引的字段
 - 创建最佳索引
 - 记录已经存在过的索引
 - 淘汰过时的索引


与常规索引的区别
======


常规索引的创建是根据查询语句的过滤器(查询条件)由人主观地判断该如何建立一个最合理的索引,它受限于指定的过滤器(查询条件)与人的技术水平。不合理地创建索引反而会影响性能。


动态索引的创建同样需要根据过滤器,但它更注重于对库中已有数据的分布情况进行分析,然后找到一个最合理的索引路径。


数据分布情况的确定
======


通过下面的方式,可以可以确定数据行的大小:


 - select count(1)
 - row id
 - increment sequence


知道数据行(数据容量)的大小还不够,数据的分布情况才是影响索引效率的关键点。


根据索引树的结构,我们可以得出结论:数据分布越广,索引发挥的性能越明显。


例如:我们在一批同一型号的车辆中找到某一辆相当费力,如果在停车场要确认是否有一辆法拉利那就容易多了。型号越多,要找到某一辆车就越快(有索引的情况下)。


数据分布是否广泛的确定方式:


```


select count(type) as counter from cars group by type


```
counter 值越大,代表type在的分布越分散。对于索引树来说,这是一大好事!


排序规则
======
分布越分散的,排列得越靠前。


例如:typeCount > nameCount
创建的索引应该是:


```sql


create index type_name_idx on cars (type,name)


```


最适合的使用场景
======


动态的查询语句最大的麻烦是:你不能确定用户在何时会使用哪种过滤器组合过滤结果。 如果有2个查询条件,那么它的查询组合方式就有3种。当组合数量达到一定的规模下,使用常规的索引创建方式很有可能出现漏网之鱼。


可能出现的问题
======


需要动态地了解数据的分布情况,需要对数据不断的计算分析,这样会带来性能的消耗,可能会影响到正常的使用。


解决方案
======


1. 在闲时(资源使用少)的情况下计算数据分布情况。可以选择凌晨系统用户较少的时候。
2. 合理地设置计算周期,如果一天内每个数据的分布情况误差对索引性能影响可以忽略的情况下可以放弃计算。
3. 在闲时(资源使用少)的情况创建计算好的索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值