MYSQL学习笔记之索引(四-五)

声明:本文章内容是根据极客时间中林晓斌的课程《MYSQL45讲》,经过学习,加以自己的理解形成的笔记。具体原文可以到官网进行阅读。如有侵权请,告知删除。

1.索引

MYSQL中的索引,其实就是一种数据结构,该结构可以提高数据的查询效率。就像一本书一样,如果拥有目录的话,你可以快速的通过浏览目录 从而找到对应的内容。而索引就相当于这本书的目录。

2.为什么使用N叉树

因为需要最大限度的减少读盘次数,N取决于数据快的大小,N 差不多是 1200。查找一个值最多需要访问3次磁盘。InnoDB常用的索引模型是B+树。

3.主键索引、非主键索引

a.主键索引的B+树,其叶子节点存储的是整行的数据信息,这也就是为什么推荐使用主键查询。主键索引也被称为聚簇索引
b.非主键索引的叶子节点,内容是主键的值,非主键索引又被称为二级索引。
那么也就可以说明**(主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小)。**

查询过程:

  • 主键索引 :select * from T where 主键索引=xxx 直接搜索 主键索引树,即可得到数据
  • 普通索引:select * from T where 普通索引=xxx 搜索该普通索引获得主键,然后再搜索主键索引树。才能获得数据,这个再次查询主键索引树的过程 称为回表
    MYSQL学习笔记之索引(四-五)
    所以尽量使用主键查询,这样可以避免搜索两颗树。
4.为什么推荐使用自增主键

自增主键的插入数据模式,正符合了递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。因为叶子节点的分裂是一个影响性能的操作。(注意:页的最小单位是16K)

5.覆盖索引

我们提到,当使用非主键查询的时候,需要回表获取数据,如: select name ,age from T where XXX 。需要先获得该条件的主键,然后再回表获取数据。但是我们可以建立一个(name,age) 索引,这样我们要查询的内容就相当于覆盖到了。这样也便是减少了搜索的次数,显著提升了查询性能。

6.联合索引想最左原则

(a,b,c)联合索引,当使用查询条件a或者查询条件 a,b 或者查条件 a,b,c时 都能用到索引。那么就是说使用索引的时候,不是说要用到索引的全部定义,只需要满足左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符.

7.索引下推

MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
如:(name,age)这个索引 当使用查询条件为 name = “张%”, age<10.在遍历到 符合name条件的时候,可以接着对索引包含的字段 进行判断 也就是直接判断是否满足 age<10.