共计 826 个字符,预计需要花费 3 分钟才能阅读完成。
综述
首先须要了解以下概念:
- B+Tree、聚簇索引、二级索引、稠密索引
- mysql page 的构造
其次,总体而言能够将获取数据的类型分为:
- 命中了索引,能够间接从聚簇索引下面获取数据,或者通过二级索引定位到聚簇索引,接着获取数据;
- 齐全没有命中索引,mysql 须要扫描所有数据页(也就是聚簇索引 B + 树的叶子节点);
具体而言,就是剖析 where 条件的具体写法,也就是常说的索引生效的状况:
查问过程不合乎 B + 树索引构造:
- 条件中有 or;
- 应用!=,<, > 等范畴查问;
- 应用 is null 和 is not null;
- 全文匹配的 like,只有 % 写在最初面才能够走索引。
在索引列上搞骚操作:
- 在索引列上进行计算;
- 在索引列上进行隐式转换;
- 在索引中应用函数;
不确定的状况下能够应用 explain 语句,剖析索引应用状况,次要看 type 和 extra 字段。
type 字段:
- 没有 join 操作,type 能够是 all、index、range、const
- 有 join 操作,type 能够是 eq_ref 和 ref
extra 字段:当 type 是 index 的时候,阐明用到了索引,extra 能够有 3 个值:
- using where:等同于 type=all,where 是在取完所有数据之后才过滤;
- 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,再去聚簇索引查到具体的数据页,就是俗称的回表。
正文完