Mysql索引原理-简书 深入理解mysql索引( 三 )
B+Tree结构:
- 非叶子节点不存储data数据,只存储索引值,这样便于存储的索引值
- 叶子节点包含了所有的索引值和data数据
- 叶子节点用指针连接,提高区间的访问性能
文章插图
相比B树,B+树进行范围查找时,只需要查找定位两个节点的索引值,然后利用叶子节点的指针进行遍历即可 。而B树需要遍历范围内所有的节点和数据,显然B+Tree效率高 。
2.4 聚簇索引和辅助索引
聚簇索引和非聚簇索引:B+Tree的叶子节点存放主键索引值和行记录就属于聚簇索引;如果索引值和行记录分开存放就属于非聚簇索引 。主键索引和辅助索引:B+Tree的叶子节点存放的是主键字段值就属于主键索引;如果存放的是非主键值就属于辅助索引(二级索引) 。在InnoDB引擎中,主键索引采用的就是聚簇索引结构存储 。
2.4.1 聚簇索引(聚集索引)
聚簇索引是一种数据存储方式,InnoDB的聚簇索引就是按照主键顺序构建 B+Tree结构 。B+Tree的叶子节点就是行记录,行记录和主键值紧凑地存储在一起 。这也意味着 InnoDB 的主键索引就是数据表本身,它按主键顺序存放了整张表的数据,占用的空间就是整个表数据量的大小 。通常说的主键索引就是聚集索引 。InnoDB的表要求必须要有聚簇索引:
- 如果表定义了主键,则主键索引就是聚簇索引
- 如果表没有定义主键,则第一个非空unique列作为聚簇索引
- 否则InnoDB会从建一个隐藏的row-id作为聚簇索引
2.4.2 辅助索引
InnoDB辅助索引,也叫作二级索引,是根据索引列构建 B+Tree结构 。但在 B+Tree 的叶子节点中只存了索引列和主键的信息 。二级索引占用的空间会比聚簇索引小很多,通常创建辅助索引就是为了提升查询效率 。一个表InnoDB只能创建一个聚簇索引,但可以创建多个辅助索引 。
文章插图
2.4.3 非聚簇索引
与InnoDB表存储不同,MyISAM数据表的索引文件和数据文件是分开的,被称为非聚簇索引结构 。
文章插图
3. 索引分析与优化
3.1 EXPLAIN
MySQL 提供了一个 EXPLAIN 命令,它可以对 SELECT 语句进行分析,并输出 SELECT 执行的详细信息,供开发人员有针对性的优化 。例如:
EXPLAIN SELECT * from user WHERE id < 3;
EXPLAIN 命令的输出内容大致如下:
文章插图
1. select_type: 表示查询的类型 。常用的值如下:
- SIMPLE : 表示查询语句不包含子查询或union
- PRIMARY:表示此查询是最外层的查询
- UNION:表示此查询是UNION的第二个或后续的查询
- DEPENDENT UNION:UNION中的第二个或后续的查询语句,使用了外面查询结果
- UNION RESULT:UNION的结果
- SUBQUERY:SELECT子查询语句
- DEPENDENT SUBQUERY:SELECT子查询语句依赖外层查询的结果 。
最常见的查询类型是SIMPLE,表示我们的查询没有子查询也没用到UNION查询 。
2.type 表示存储引擎查询数据时采用的方式 。比较重要的一个属性,通过它可以判断出查询是全表扫描还是基于索引的部分扫描 。常用属性值如下,从上至下效率依次增强 。