索引

一、正排索引

      我们都知道数据库索引(不包括全文索引,全文索引是使用的倒排索引的方式)的实现基本都是通过B-tree或者B+tree实现的,通过某个固定字段的值来建立索引搜索数据,但我们很少去提及说这些索引是正排还是倒排,所以当我脑子里冒出这个问题的时候就去网上查了一下。

      按我的理解,正排索引是通过某个固定的字段值去搜索数据,显然B-tree和B+tree实现的索引应该属于正排索引。

      1、聚集索引:也叫聚簇索引,它本身的定义是它的顺序和数据存储在磁盘的物理顺序是一致的,即数据是按聚集索引顺序存储的,所以一张表它只可能有一个聚集索引。 

           聚集索引因为是和物理顺序一致,它的检索效率肯定是最高的,但同时如果新加一条数据或者删除一条数据都会引起物理存储的顺序变化,所以增删改等维护的代价也是最大的。

           如果一张表没有聚集索引,那么它的存储是无序的。当我们在设置一张表的主键的时候,数据库会创建一个主键的唯一索引,如果这张表没有聚集索引,除非我们指定这张表不使用聚集索引,否则这时数据库会为它创建一个唯一的聚集索引,两者顺序是一致的,但请注意的是主键索引并不等于聚集索引,聚集索引不是必须唯一的,也可以为NULL,相对来说主主键索引的要求更为严格。

      2、主键索引:唯一且不为空,其它性质和普通索引区别不大,如果一个表有主键索引的话,其它索引在查询数据的时候也会通过主键查询。

      3、联合索引:联合索引由多个字段作为字段作为关键字,使用的B+tree(可以参考 树型结构及应用场景 这一篇)来实现的,不同的是节点存储的不是单一的字段,是几个字段作为一个单元的元组,如a、b、c 三个字段为索引,节点中key为(a,b,c);在叶子节点中数据的顺序是按a、b、c这样的顺序先后排序的,举个例子:

           有 (a1,b1,c1),(a2,b1,c1) , (a1,b1,c2)  三行数据,叶子节点的顺序应该是 (a1,b1,c1), (a1,b1,c2) ,(a2,b1,c1) 

           所以这种排序的方式决定了只要条件中字段在索引中是连续的没有断开,索引就能生效,即联合索引的最左前缀的原则:

                 1) where 条件中 字段想要使用到索引,就必须保证索引中在这个字段前面的字段在where条件中存在且使用到了索引(当然where之后字段顺序无所谓,因为数据库优化器会自己按索引优化调整为最佳顺序)

                 2) where 条件中 范围条件之后的字段索引将失效(因为它使得我们的查询结果有可能是很多段不连续的数据组成的)

      注:

           in 和 or (不同数据库可能有不同实现,下面说的不一定适合每个数据库,但它是部分数据库的自动优化方式):

           in语句会被优化器转换成子查询语句,而子查询语句内部执行的时候是通过=号去关联的,所以它是走索引的且非范围查询,or语句优化器会拆解为几个走索引的sql然后union,也是走索引的。

           like 是可以使用索引的,前提是条件是 'xxx%' ,而不是 '%xxx%';但它是范围查询

 

        数据库优化:

                   1) 索引优化: 一般查询慢的语句先看它是否使用了索引,用explain查询sql的执行计划,如果没有使用索引就按上面的原则看看哪里不对,然后调整。

                    尽量减少空值判断,避免全表扫描。

                    函数计算是不会走索引的,尽量避免。

                   2) 分库、分表、分区,https://blog.csdn.net/qq_28289405/article/details/80576614

二、倒排索引

       将内容通过分词器分解成一个一个的单词,对这个单词建立索引,通过内容关键字查询数据。

       使用倒排索引的有数据库中的 全文索引和es

       需注意的是,分解之后的单词不一定是和内容里面的单词一模一样的,有可能是它的近义词,小写等等,主要看选择的是什么分词器。

       相较于正排索引,倒排索引新增一行数据需要对索引进行修改,代价是比较大的,但是对于文本内容的查询效率非常高,修改少,查询多的,项目非常适合。

 

       倒排索引的内容比较多,因为这里只是总结就简单提一下,感兴趣的小伙伴可以搜索数据库全文索引和es。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值