本文出处:http://www.cnblogs.com/wy123/p/7211742.html 
(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)

MySQL中的InnoDB引擎表索引类型有一下几种(以下所说的索引,没有特殊说明,均指InnoDB引擎表索引。)
  0 = Secondary Index,二级索引,
  1 = Clustered Index,聚集索引
  2 = Unique Index,唯一索引
  3 = Primary Index,主键索引
  32 = Full-text Index,全文索引
  64 = Spatial Index,空间索引
  128 = A secondary index that includes a virtual generated column.二级计算列索引。

其中二级索引,聚集索引,唯一索引,主键索引,二级计算列索引,按照逻辑存储结构来看,都是B+树来存储的
这一点与其他数据库的B+树索引逻辑存储结构上看,并没有太大的不同,以上几种索引都是从逻辑角度来划分的。

如果从物理存储角度来看,MySQL中的这几类索引可以划分为聚集索引和二级索引(或者叫非聚集索引)
其中,主键索引和聚集索引,可以归类为聚集索引,二级索引,唯一索引,二级计算列索引都数据非聚集索引。

MySQL中的聚集索引

MySQL聚集索引就是根据主键,把整张表的数据,在逻辑上组织成一棵B+树,因此一个表只能由一个聚集索引。
非叶子节点存储聚集索引key值,叶子节点存储表中的数据本身,叶子节点与叶子节点之间采用双向链表的方式连接在一起。

了解MySQL的聚集索引之前,先了解一下MySQL主键生成机制。
MySQL的InnoDB必须有一个主键,
如果在建表的时候指定了主键,那么这个主键就是该表的主键(听起来这么别扭,主要是跟未指定主键的情况下,自动生成的额主键作对比)
如果在建表的时候没有指定主键,那么存储引擎会自动为表上建一个主键列
1)对于指定了主键的表,主键生成的索引就是“主键索引”,
2)对于未指定主键的表,如果有(一个或者多个)非空的唯一索引,(第一个)非空唯一约束做主键
3)对于未指定主键的表,且没有唯一约束的表,默认生成一个主键,该主键上生成的索引就是“聚集索引”,
实际上,前者的“主键索引”和后者的“聚集索引”,物理存储上都可以归属为聚集索引

1,显式主键索引(聚集索引)

如下截图,创建了test_index_type_1
在建表的时候指定了主键,则主键默认生成主键索引,索引类型是3(从物理存储角度看,是聚集索引)
在表创建完成之后创建了索引,生成的是二级索引,索引类型是0(从物理存储角度看,是非聚集索引)

  

2,非空唯一约束生成的主键索引(聚集索引)

如下截图,创建了test_index_type_2,
在建表的时候没有指定了主键,但是指定了一个唯一的非空约束,那么这个字段会当做主键用,生成的索引类型是3(从物理存储角度看,是聚集索引)

  

3,系统默认主键生成的聚集索引(聚集索引)

如下截图,创建了test_index_type_3表,
在建表的时候没有指定了主键,也没有指定唯一的非空约束,InnoDB引擎会自动生成一个6字节的指针,生成的索引类型是聚集索引,类型是1(从物理存储角度看,是聚集索引)

  

非聚集索引

  非聚集索引,非聚集索引同样是B+树的结构来存储数据的,
  与聚集索引做大的差异在于非聚集索的叶子节点存储的仅仅是索引的key值+聚集索引的key值,但是不包括所有的非索引键值。

  1,唯一索引约束生成的唯一索引(非聚集索引)

如下截图,创建了test_index_type_4表,
指定了id为unique的,那么会自动在id列上创建一个唯一索引。

2,手动创建的唯一索引(非聚集索引)
  如下截图,创建了test_index_type5表,
  手动在创建一个唯一的索引,那么这个索引类型为唯一索引

  

3,手动创建的二级索引(非聚集索引)
  如下截图,创建了test_index_type6表,
  那手动在创建一个的索引(未指定unique),那么这个索引类型为二级索引

  

4,计算列索引,在计算列上手动创建索引(非聚集索引)
  如下截图,创建了test_index_type7表,
  test_index_type7上有一个计算列,创建完成之后在计算列上加索引,索引为计算列索引

    

总结:

整体上来看,MySQL的几种类型的B+树的索引还是比较容易理解的,跟SQL Server中的索引也比较类似。
MySQL的InnoDB引擎表中,主键索引,非空唯一约束生成的聚集索引,聚集索引,从物理存储上看都数据聚集索引。
主键索引,非空唯一约束生成的聚集索引,聚集索引,三者有一个明显的特点,都要求所在的列是非空且唯一的。
另外就是MySQL无法显式创建聚集索引,也即create clustered index.

这一点与SQL Server有很大的不同,
1,在SQL Server中,如果没有指定主键,或者指定了主键没有但是指定为nonclustered,那么表就是为堆表,系统不会添加默认字段作为聚集索引
2,SQL Server的主键可以仅仅是主键,可以不是聚集索引(默认情况下主键是聚集索引)。

聚集索引可以指定在任意一个列上,可以是非主键列,可以是非唯一,可为null,可重复的列,比如如下

MySQL InnoDB引擎B+树索引简单整理说明的更多相关文章

  1. 一分钟掌握MySQL的InnoDB引擎B+树索引

    MySQL的InnoDB索引结构采用B+树,B+树什么概念呢,二叉树大家都知道,我们都清楚随着叶子结点的不断增加,二叉树的高度不断增加,查找某一个节点耗时就会增加,性能就会不断降低,B+树就是解决这个 ...

  2. mysql InnoDB引擎支持hash索引吗

    https://blog.csdn.net/doctor_who2004/article/details/77414742

  3. mysql InnoDB引擎索引超过长度限制

    组合索引长度之和大于 767 bytes并无影响,当有某个字段定义长度大于 767 bytes(1000*3)时,仅产生告警,但不影响创建,超长字段会取前 255 字符作为前缀索引,并且组合索引中字段 ...

  4. 聊一聊 InnoDB 引擎中的索引类型

    索引对数据库有多重要,我想大家都已经知道了吧,关于索引可能大家会对它多少有一些误解,首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书 ...

  5. InnoDB 引擎中的索引类型

    首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理. MySQL ...

  6. 巧用MySQL InnoDB引擎锁机制解决死锁问题(转)

    该文会通过一个实际例子中的死锁问题的解决过程,进一步解释innodb的行锁机制 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深 ...

  7. Mysql InnoDB引擎下 事务的隔离级别

    mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...

  8. mysql InnoDB引擎是否支持hash索引

    看一下mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/create-index.html , 从上面的图中可以得知,mysql 是支持hash索引的 ...

  9. InnoDB的B+树索引

    B+树索引其本质就是B+树在数据库中的实现,但是B+索引在数据库中有一个特点就是其高扇出性,因此在数据库中,B+树的高度一般都在2-3层,也就是对于查找某一键值的行记录,最多只需要2到3次IO,这倒不 ...

随机推荐

  1. s21day11 python笔记

    s21day11 python笔记 一.函数小高级 函数名可以当作变量来使用 #示例一: def func(): print(123) func_list = [func, func, func] # ...

  2. 20155208徐子涵 Exp4 恶意代码分析

    20155208徐子涵 Exp4 恶意代码分析 实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使 ...

  3. java 实现自定义事件

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...

  4. 修改linux服务器的MySQL密码

    1.   首先用管理员权限登陆Linux: 2.   输入:vi  /etc/my.cnf  回车.然后按“i”键盘,在这个文件中的最后一行输入:skip-grant-tables   然后按 esc ...

  5. 第一章 C#入门(Windows窗体应用程序)(二)

    C#窗体应用程序(二) [案例]设计登录界面,效果如下: [案例实现步骤] 1.新建项目(Windows控制台应用程序 文件→新建→项目:选择“项目类型”为Visual C#,“模板”为Windows ...

  6. Excel函数之sumifs应用

    这个函数是用来进行多条件求和的一个函数 示例:根据表格求出“鼎盛书店”2012年度所有图书小计的总和,这里就用sumifs计算 首先定位结果输出单元格,祭出函数. sum_range参数就是筛选后需要 ...

  7. python永久添加环境变量

    import sys sys.path 系统环境是一个list,可以将自己需要的库添加进入,例如mysql库,hive库等等.有三种方式添加,均验证通过:     1 临时添加,在一个shell窗口中 ...

  8. [UE4]添加手柄

    一.在上一节的VRPawnBase中,再添加2个Motion Controller,分别命名为:LeftMotionController.RightMotionController,分别代表左右手柄. ...

  9. 学习MeteoInfo二次开发教程(七)

    1.站点文件 12010615.syn在D:\Program Files (x86)\MeteoInfo\SampleSYNOP_Stations.csv在D:\Program Files (x86) ...

  10. LSTM/RNN中的Attention机制

    一.解决的问题 采用传统编码器-解码器结构的LSTM/RNN模型存在一个问题,不论输入长短都将其编码成一个固定长度的向量表示,这使模型对于长输入序列的学习效果很差(解码效果很差). 注意下图中,ax ...