加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 建站 > 正文

数据库两大必备神器:索引和锁底层原理是什么!

发布时间:2018-10-17 04:09:06 所属栏目:建站 来源:Java3y
导读:副标题#e# 【51CTO技术沙龙】10月27日,让我们共同探索AI场景化应用实现之道 一、索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度; 表经常进行INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任

非聚集索引在建立的时候也未必是单列的,可以多个列来创建索引。

  •  此时就涉及到了哪个列会走索引,哪个列不走索引的问题了(最左匹配原则-->后面有说)
  •  创建多个单列(非聚集)索引的时候,会生成多个索引树(所以过多创建索引会占用磁盘空间)

数据库两大必备神器:索引和锁底层原理是什么!

在创建多列索引中也涉及到了一种特殊的索引-->覆盖索引

  •  我们前面知道了,如果不是聚集索引,叶子节点存储的是主键+列值
  •  最终还是要“回表”,也就是要通过主键再查找一次。这样就会比较慢
  •  覆盖索引就是把要查询出的列和索引是对应的,不做回表操作!

比如说:

  •  现在我创建了索引(username,age),在查询数据的时候:select username , age from user where username = 'Java3y' and age = 20。
  • 很明显地知道,我们上边的查询是走索引的,并且,要查询出的列在叶子节点都存在!所以,就不用回表了~

  •  所以,能使用覆盖索引就尽量使用吧~

7、索引最左匹配原则

最左匹配原则:

  •  索引可以简单如一个列(a),也可以复杂如多个列(a, b, c, d),即联合索引。
  •  如果是联合索引,那么key也由多个列组成,同时,索引只能用于查找key是否存在(相等),遇到范围查询(>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找。
  •  因此,列的排列顺序决定了可命中索引的列数。

例子:

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

8、=、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。

9、索引总结

索引在数据库中是一个非常重要的知识点!上面谈的其实就是索引最基本的东西,要创建出好的索引要顾及到很多的方面:

  1,最左前缀匹配原则。这是非常重要、非常重要、非常重要(重要的事情说三遍)的原则,MySQL会一直向右匹配直到遇到范围查询(>,<,BETWEEN,LIKE)就停止匹配。

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

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读