本文出处: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. Linux 驱动——Led驱动1

    led_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/init ...

  2. echarts地图散点高亮弹框制作

    效果图如下: 实现大致思路: 引入echarts最新版本,还有china.json,以及地级市坐标,(因为产品需求中不考虑省份,只考虑各个地级市),echarts官网已经不让下载地图了,网上很多地级市 ...

  3. Oracle数据库死锁和MySQL死锁构造和比较

    最近在复习数据库的事务隔离性,顺便构造了一下在Oracle上和MySQL上的死锁以比较异同. 在Oracle上面的实验 在Oracle中,因为是显式提交,所以默认可以认为在一个会话中若没有使用comm ...

  4. echarts移除百度地图logo方法

    移除百度地图LOGO和版权信息 在jsp头上加上如下代码即可: <style type="text/css"> .anchorBL{ display:none } &l ...

  5. leetcode 846.Hand of Straights

    对于一个数组中的数分为W组且在每一组内的数是连续存在的. 考虑使用map映射来记录每个数的个数的,并且对于数组中的数进行从小到大的排列的.同时每次需要更新最开始的那个起始数的,可能是以及出现的也可能是 ...

  6. Ubuntu下math库函数编译时未定义问题的解决

    自己在Ubuntu下练习C程序时,用到了库函数math.h,虽然在源程序中已添加头文件“math.h”,但仍提示所用函数未定义,原本以为是程序出错了,找了好久,这是怎么回事呢? 后来上网查了下,发现是 ...

  7. hive数据导出到本地目录 抛异常

    经过反复试验,最终重启hdfs和hive解决问题 hive> insert overwrite local directory '/Users/wooluwalker/Desktop/' sel ...

  8. redis 远程连接出错的解决办法

    1. 配置防火墙端口 redis系统的默认端口是6379端口. # 打开端口 $ firewall-cmd --zone=public --add-port=6379/tcp --permanent ...

  9. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)

    如下表   模式 可做操作 若文件不存在 是否覆盖 r 只能读 报错 - r+ 可读可写 报错 是 w 只能写 创建 是 w+ 可读可写 创建 是 a 只能写 创建 否,追加写 a+ 可读可写 创建 ...

  10. [C#]如何将 string 安全地转换为 int

    当遇到string向int类型转换时会遇到以下问题: 1.字符串非数字格式 2.字符串描述的不是int型 3.转换后越界 这些情况都需要用try catch来捕获异常并处理 安全简单的转换可以用 In ...