名词解释

clustered index(聚集索引)

对(primary key)主键索引的一种表述。InnoDB表存储是基于primary key列来组织的,这样做可以加快查询和排序速度。为了获得最好的性能,在选择primary key columns的时候要特别小心。因为修改clustered index(聚集索引)列是一个昂贵的操作,所以选择作为primary的列通常都是很少或者从不会被更新的列。

primary key(主键)

A set of columns(一组列),可以唯一标识表中的每一行。因此,它必须是一个unique index,并且不允许有NULL值。

InnoDB organizes the table storage based on the column values of the primary key.

secondary index(辅助索引或二级索引)

索引的一种类型。一个InnoDB表可以有0个或者多个secondary index。

B-tree

tree数据结构在数据库索引中被广泛采用。这种结构总是有序的。可以快速查找,精确匹配(等于)或者范围匹配(比如,大于、小于、BETWEEN等操作)。大多数的存储引擎都是使用的这种结构,比如InnoDB和MyISAM。

因为B-tree节点可以有许多孩子,一个B-tree和二叉树不一样,二叉树它限制每个结点只能2个孩子。

聚集索引和辅助索引

每个InnoDB表都有一个特别的索引叫clustered index。通常,clustered index和primary key是一个意思。

为了在查询、插入以及数据库的其它操作时获得最好的性能,你必须理解InnoDB中是怎样使用clustered index优化大多数查询的。

  • 当你在表中定义了一个PRIMARY KEY的时候,InnoDB会把它作为clustered index。在你创建每一张表的时候最好定义一个primary key,如果实在没有一个或者一组逻辑唯一并且非空的列,你就添加一个新的auto-increment(自增长)的列,让它的值自动填充。
  • 如果你没有在你的表中定义PRIMARY KEY,那么MySQL将查找第一个所有值非空的唯一索引列作为clustered index。
  • 如果表中没有PRIMARY KEY,而且也没有合适的UNIQUE index,那么InnoDB内部将生产一个名字叫GEN_CLUST_INDEX的隐藏clustered index,其值为行ID

Clustered Index是如何加速查询的

通过clustered index来访问一行是非常快的,因为索引检索直接指向数据所在的页。如果一个表很大,clustered index架构通常会节省I/O操作。

Secondary Indexes是如果关联到Clustered Index的

除了clustered index之外的其它索引都叫Secondary Indexes。在secondary index中的每一条记录包含那一行的primary key列。InnoDB用这个primary key的值来检索聚集索引中的行。

如果primary key很长,那么secondary indexes将会占用更多的空间,因此用一个简短的primary key是有好处的。

一个InnoDB索引的物理结构

InnoDB indexes are B-tree data structures. Index records are stored in the leaf pages of their B-tree data structure. The default size of an index page is 16KB.

当一条新记录被插入到InnoDB clustered index中时,InnoDB预留page(页)的1/16的空间以备将来插入或者更新索引记录。如果索引记录是顺序插入的(升序或者降序),那么填满这一页就是剩下的那15/16的空间;如果记录是按照随机顺序插入的,那么填满这一条就是1/2到15/16页。配置项innodb_fill_factor定义每个B-tree page 百分之多少的空间用于存储有序的索引记录,剩下的空间是为以后索引增长而预留的。

你可以通过innodb_page_size设置InnoDB表空间的page size。支持64KB, 32KB, 16KB (default), 8KB, and 4KB.

小结

1、如果表中没有定义primary key,则查找第一个不为空的唯一索引列作为聚集索引,若找不到,则生成一个隐藏的聚集索引

2、插入新记录的时候,预留一页的1/16的空间用于以后的插入或更新

参考 https://dev.mysql.com/doc/refman/5.7/en/innodb-indexes.html

InnoDB索引的更多相关文章

  1. MySQL的InnoDB索引原理详解

    摘要 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇 ...

  2. MyISAM和InnoDB索引区别

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 图8 这里设表一共有三列,假设我们以Col1为主键,则图8是一个MyISAM表 ...

  3. MySQL的InnoDB索引原理详解 (转)

    摘要: 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本 ...

  4. mysql InnoDB 索引小记

    0.索引结构 1).MyISAM与InnoDB索引结构比较,如下: 2).MyISAM的索引结构 主键索引和二级索引结构很像,叶子存储的都是索引以及数据存储的物理地址,其他节点存储的仅仅是索引信息.其 ...

  5. myisam和innodb索引实现的不同

    1.MyISAM 使用B+Tree 作为索引结构,叶子节点的data存放指针,也就是记录的地址.对于主键索引和辅助索引都是一样的.2.InnoDB 也使用B+Tree作为索引结构,也别需要注意的是,对 ...

  6. InnoDB 索引原理

    InnoDB索引原理 索引能够提高访问的速率 B+树索引(最为常用和最为有效).全文索引.哈希索引. 数据库中的B+树索引可以分为聚集索引和辅助索引,但是不管是聚集还是辅助的索引,其内部都是B+树,是 ...

  7. 转 InnoDB索引

    原文: http://blog.codinglabs.org/articles/theory-of-mysql-index.html InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结 ...

  8. MySQL InnoDB 索引组织表 & 主键作用

    InnoDB 索引组织表 一.索引组织表定义 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT). 在Inno ...

  9. 使用innodb_ruby探查Innodb索引结构

    使用innodb_ruby探查Innodb索引结构 innodb_ruby 是使用 Ruby 编写的 InnoDB 文件格式解析器.innodb_ruby 的目的是暴露一些其他隐藏的 InnoDB 原 ...

随机推荐

  1. 电脑打不开网页,使用dns优化下就可以了。

    通过电脑管家dns优化下就可以了.启用114DNS

  2. the method of validate slow

  3. 图解vue生命周期

    学习vue时搞清楚生命周期可以帮助你知道什么时候在什么地方执行该执行的方法,话不多说上图: 复制下面代码可以在控制台更详细展示各个钩子的状态 <!DOCTYPE html> <htm ...

  4. Arduino 开源库 u8glib2 之 图标显示【原创】

    Arduino 开源库 u8glib2 研究之 图标显示                -----------------关于drawXBM drawXBMP函数使用的研究 因为心血来潮,近来想做一个 ...

  5. 平安E行销扫脸打卡/人寿国寿e店云参会钉钉考勤,原来这么轻易被破解!

    由于近几年人们的保险意识越来越强,身边有很多朋友都在中国人寿,中国平安等保险公司上班薪水高,工作自由,又可以学习很多保险理财的知识,每天早会个2~3个小时,剩下的基本都是自己的时间,(vx:99508 ...

  6. 我是如何将网站全站启用Https的?-记录博客安装配置SSL证书全过程

    评论»   文章目录 为什么要Https 如何选择Https 安装部署SSL证书 平滑过渡Https 搜索引擎的响应 启用Https小结 正如大家所看到的,部落全站已经启用了Https访问了,连续几天 ...

  7. dede后台登陆后一片空白的解决办法汇总

    dede后台登陆后一片空白的第一种解决办法: 找到:include/common.inc.php文件,打开,查找程序代码://error_reporting(E_ALL);error_reportin ...

  8. 邓_php面试【002】——完整版

    1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) $a = date("Y-m-d H:i:s", strtotime("-1 day&q ...

  9. Web API (四) 特性路由(Attribute Route)

    特性路由 是Web API 2 中提出的一种新的类型的路由,正如其名称那样,它是通过特性(Attribute) 来定义路由的,相比之前的基于模式(Convertion Based)的路由,特性路由 能 ...

  10. NSLog( @"%@", i );

    NSLog( @"%@", i );  %@需要显示对象,所以这个i必须是个对象类型.