一般来讲有索引,会使查询变快,但有时候,有索引也不会快,也不会走索引
索引记录了rowid,以及值,根据rowid可以直接找到数据文件的位置
B树索引结构使根节点到每一个叶子节点的路径都是相等的
索引是有序的,在创建的时候就是有序的
索引创建时,在第一个块内存放列值和rowid,当第一个块存满了,就新增一个块存列值和rowid,同时新增一个管理这两个叶子块的分支块,分支块内存放叶子块的rowid和叶子块的数值范围,当第二个叶子块满了,会增加第三个叶子块,同时在分支块内再增加一条数据,当增加了很多叶子块,同时在分支块内增加了很多数据以后分支块也满了,会再新增一个分支块,同时新增一个根块,用来管理分支块,根块存放的内容为分支块的rowid和数值范围
索引扫描分为:索引唯一扫描,索引范围扫描,索引全扫描,索引快速全扫描,索引跳跃扫描
聚簇因子:聚簇因子是索引非常重要的一个参数,聚簇因子越大,说明这个索引越不好,越小说明索引越好
聚簇因子算法:相邻两个数据是不是在一个数据块里,不是就加一不是就加一,所以数据都在一个块里的索引是非常好的,比如RB_ACCT里的INTERNAL_KEY就是有序存的,INTERNAL_KEY上的索引就是非常好的,CLIENT_NO的就比较差了
回表:假如索引只建在了INTERNAL_KEY上面,你SELECT INTERNAL_KEY FROM FSD.RB_ACCT WHERE INTERNAL_KEY = 啥啥 了,那就不用回表,因为索引里面记录了INTERNAL_KEY的键值,但是假如你SELECT INTERNAL_KEY,CLIENT_NO FROM FSD.RB_ACCT WHERE INTERNAL_KEY = 啥啥,索引里面只记录了INTERNAL_KEY,没有CLIENT_NO,所以你查询的时候,是需要先拿到索引里面这一条数据的rowid,然后根据rowid找到这个数据在数据块里面的位置,然后再回表,拿到CLIENT_NO,但是假如你索引建的时候,就建的复合索引,直接建在了INTERNAL_KEY和CLIENT_NO上面,那就不用回表,因为索引里面存了键值
位图索引:缺点明显,容易造成锁表,优点明显,and, or的时候很快,条件很苛刻,要求索引字段更新少甚至不更新,并且值要尽量少。综合起来:尽量不要用就好了
解释:为什么锁表?因为位图索引记录的是1,0这种,有还是没有,新增一条数据,会锁定整个表,或者整个索引,来更新索引,默认非online,锁表,会使业务失败,online,锁索引,不会使业务失败,但是就比较慢
为什么and or很快?
不用排序,占的空间也小,就是有或者没有,当然快
为什么尽量不要用?
因为不合适并发,假如两个insert,一个没提交,另一个就只能等,就很慢,还容易锁
函数索引:留坑
直方图:留坑