综述
首先须要了解以下概念:
- 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,再去聚簇索引查到具体的数据页,就是俗称的回表。