此文转载自我的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. 在闲时(资源使用少)的情况创建计算好的索引