数据库索引

一、索引的基本特点

1、索引可以加快数据库的检索速度

2、表经常进行INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度;

3、索引需要占物理和数据空间

4、尽量选择区分度高的列作为索引,区分度的公式是 COUNT(DISTINCT col) / COUNT(*)。表示字段不重复的比率,比率越大我们扫描的记录数就越少。

5、存在最左匹配原则

二、mysql数据库使用的索引

Mysql支持Hash索引和B+树索引两种。

1、B+树索引:主流的还是使用B+树索引比较多。

2、哈希索引:

       哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。本质上就是把键值换算成新的哈希值,根据这个哈希值来定位。

哈希索引有好几个局限(根据他本质的原理可得):

  • 哈希索引也没办法利用索引完成排序;

  • 不支持最左匹配原则;

  • 在有大量重复键值情况下,哈希索引的效率也是极低的---->哈希碰撞问题;

  • 不支持范围查询;

三、聚集和非聚集索引

聚集索引就是以主键创建的索引;非聚集索引就是以非主键创建的索引;

区别:

1、聚集索引在叶子节点存储的是表中的数据;

2、非聚集索引在叶子节点存储的是主键和索引列;

3、使用非聚集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。(拿到主键再查找这个过程叫做回表)

因此非聚集索引也叫做二级索引。

四、哪个列会走索引,哪个列不走索引---索引最左匹配原则

最左匹配原则:

1)索引可以简单如一个列(a),也可以复杂如多个列(a, b, c, d),即联合索引。

2)如果是联合索引,那么key也由多个列组成,同时,索引只能用于查找key是否存在(相等),遇到范围查询(>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找。

3)因此,列的排列顺序决定了可命中索引的列数。

例子:

1)如有索引(a, b, c, d),查询条件a = 1 and b = 2 and c > 3 and d = 4,则会在每个节点依次命中a、b、c,无法命中d。(很简单:索引命中只能是相等的情况,不能是范围匹配)

另外、=、in自动优化顺序

不需要考虑=、in等的顺序,mysql会自动优化这些条件的顺序,以匹配尽可能多的索引列。

例子:

  • 如有索引(a, b, c, d),查询条件c > 3 and b = 2 and a = 1 and d < 4与a = 1 and c > 3 and b = 2 and d < 4等顺序都是可以的,MySQL会自动优化为a = 1 and b = 2 and c > 3 and d < 4,依次命中a、b、c。

参考文章:

https://mp.weixin.qq.com/s?__biz=MzI2NjA3NTc4Ng==&mid=2652080263&idx=1&sn=abe32fec529c041b9893f7e8d075bab3&chksm=f1748362c6030a74d8c6b296c10b3e8264a9d50faf1a03ef15bf2b4f64b979938921d30fd746&mpshare=1&scene=1&srcid=08013OR4WnelS77J3vAJY2Mx#rd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值