关于mysql:mysql查询索引的过程

39次阅读

共计 826 个字符,预计需要花费 3 分钟才能阅读完成。

综述

首先须要了解以下概念:

  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,再去聚簇索引查到具体的数据页,就是俗称的回表。

正文完
 0