本文出处: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 vpformysql引擎_MySQL InnoDB引擎B+树索引简单整理说明相关推荐

  1. mysql引擎测试_MySQL MyISAM引擎和InnoDB引擎的性能测试

    以下的文章主要介绍的是MySQL MyISAM引擎和InnoDB引擎的性能测试,MyISAM引擎和InnoDB引擎在实际操作中是经常运用到的,以下的文章就是对MySQL MyISAM引擎和InnoDB ...

  2. mysql 5.6l安装教程,Mysql中MyISAM引擎和InnoDB引擎的比较

    结论 如果不清楚自己应该用什么引擎,那么请选择InnoDB,Mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的引擎是MyISAM MyISAM 和 InnoDB的适用场景 M ...

  3. MySQL存储引擎(InnoDB引擎)

    本篇章主要介绍什么是 MySQL 存储引擎?常用的 MySQL 存储引擎有哪些?以及详细介绍一下目前应用最广泛的 InnoDB 存储引擎,包括其:逻辑存储结构.架构.事务原理.MVCC等. 一.初识  ...

  4. Linux环境编译安装Mysql以及补装innodb引擎方法

    mysql安装  5.6以后可能会收费,所以选择5.1 以下从台湾中山大学镜像下载 1.首先要安装C++编译环境 # yum install gcc-c++ 2.下载解压 # wget http:// ...

  5. MySQL中MyISAM引擎与InnoDB引擎性能简单测试[转]

    MySQL中MyISAM引擎与InnoDB引擎性能简单测试 [硬件配置] CPU : AMD2500+ (1.8G) 内存: 1G/现代 硬盘: 80G/IDE [软件配置] OS : Windows ...

  6. mysql模板引擎_MYSQL存储引擎解释

    存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念, ​ MySQL支持多种存储引擎,每种引擎有着一些自己独特的功能,用户在使用的时候,可以根 ...

  7. mysql中b树是什么_MySQL优化中B树索引知识点总结

    为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太长, 3.或等待时间太长 4.sql语句欠佳,以及我们索引失效 5.服务器参数设置不合理 SQL语句执行过程分 ...

  8. mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解

    前言 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也 ...

  9. mysql innodb表移植_mysql Innodb引擎独立表空间下通过复制.ibd文件快速迁移数据文件...

    假设需求:需要把库test1中的的数据迁移到test2中,并且test2中数据量特别大 硬性条件:1.mysql 使用 Innodb引擎,且开启独立表空间,2.两个库的mysql版本一致(不同版本下未 ...

最新文章

  1. java 返回double数组_java-如何使用Collectors.averagingDouble计算双精度数组的均值?
  2. 如何使用 autofs 挂载 NFS 共享
  3. tp5 cache缓存简单使用
  4. ajax实现highchart与数据库数据结合完整案例分析(三)---柱状折线图
  5. Python_48re模块的sub方法
  6. Mosquitto 0 15 开源MQTT v3 1 Broker
  7. 解决Eclipse启动Tomcat时报Error loading WebappClassLoader错误
  8. apache+php+mysq环境详细l配置
  9. Android开发技术周报 Issue#38
  10. SVN分支管理最佳策略
  11. Spring Security技术栈学习笔记(十)开发记住我功能
  12. Seafile私有云盘搭建详解
  13. 三星手机动态修改分辨率信息
  14. CSS Table(表格)
  15. 剑客vs刀客 Java vs .NET
  16. 2006-2020年全国31省人口老龄化水平
  17. 大数据HBase入门
  18. 瑞吉外卖项目:新增菜品与菜品分页查询
  19. Front Immunol 复现 | 4. 使用estimate包评估肿瘤纯度
  20. 镜头光学指标介绍----清晰度SFR/MTF

热门文章

  1. SAP登陆界面TITLE修改方法(Method of SAP Logon GUI Title Modification)
  2. “抢滩”中高端酒店,新老玩家谁会更先跑出来?
  3. 金融行业创新突围,华为如何趟过产业数字化深水区?
  4. linux(Ubuntu)查看环境变量指向的路径
  5. CTF盲水印工具安装(排雷)
  6. 解决UbuntuE: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
  7. 二级c语言基础知识pdf下载,全国计算机等级考试二级C语言公共基础知识.pdf
  8. python下timer定时器常用的两种实现方法
  9. Python 有序字典(OrderedDict)与 普通字典(dict)
  10. 学生计算机基础知识,初中计算机基础知识练习题集锦(学生)