综述

首先须要了解以下概念:

  1. B+Tree、聚簇索引、二级索引、稠密索引
  2. mysql page的构造

其次,总体而言能够将获取数据的类型分为:

  1. 命中了索引,能够间接从聚簇索引下面获取数据,或者通过二级索引定位到聚簇索引,接着获取数据;
  2. 齐全没有命中索引,mysql须要扫描所有数据页(也就是聚簇索引B+树的叶子节点);

具体而言,就是剖析where条件的具体写法,也就是常说的索引生效的状况:

  1. 查问过程不合乎B+树索引构造:

    1. 条件中有or;
    2. 应用!=,<, > 等范畴查问;
    3. 应用is null和is not null;
    4. 全文匹配的like,只有%写在最初面才能够走索引。
  2. 在索引列上搞骚操作:

    1. 在索引列上进行计算;
    2. 在索引列上进行隐式转换;
    3. 在索引中应用函数;

不确定的状况下能够应用explain语句,剖析索引应用状况,次要看type和extra字段。

  • type字段:

    1. 没有join操作,type能够是all、index、range、const
    2. 有join操作,type能够是eq_ref和ref
  • extra字段:当type是index的时候,阐明用到了索引,extra能够有3个值:

    1. using where:等同于type=all,where是在取完所有数据之后才过滤;
    2. using index:能够间接在索引树上实现检索,无需拜访理论的行数据。

mysql的数据也并非所有状况下都在叶子节点,当数据类型是blob或text且超过page size的一半(通常是8k,默认的page size是16k,这个值能够配置为4k,8k,16k,32k,64k),blob字段的值会被放到其余页,索引页只留下blob的前768个字节。

所谓的回表

默认状况下,mysql会用id作为聚簇索引;在没有id或者id不惟一的状况下,才会应用unique key作为索引。
假如有二级索引且有id作为聚簇索引,mysql会创立两颗B+树,查问二级索引会先去二级索引的B+树的叶子节点找到id,再去聚簇索引查到具体的数据页,就是俗称的回表。