名词解释

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. HDU 2119 Matrix

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2119 解题思路: 处理数据,使用公式最小点覆盖数=最大匹配数,使用匈牙利算法求二分图最大匹配即可. ...

  2. 分布式文件系统FastDFS动态扩容

    当用户量越来越大,则集群中某个group总会到达其极限,这时就得扩展集群的容量了. FastDFS的扩容分为对group纵向扩容和横向扩容 纵向扩容 指在同一个group组中增加服务器,实现数据冗余, ...

  3. 关于keil5使用注意事项(预定义、路径包含)

    2017.12.17  下午 终于在不用keil5自带添加库的基础上0 error的新建了一个工程.磕磕绊绊搞了快一个下午,各种小问题搞到崩溃. 首先是库文件添加路径的问题 ,只要是你工程中用到的头文 ...

  4. vue 开发2017年变化回顾及2018年展望

    vue.js 变化 从 github 的发布记录我们可以看到2017年 vue.js 的第一个发布为 v2.1.9,最后一个为 v2.5.13,主要发布小版本 2.2~2.5.这些发布提升了vue 与 ...

  5. NSMutableArray 记住取不到时要进行强转

    NSMutableArray  记住取不到时要进行强转

  6. [知了堂学习笔记]_MVC设计模式与JavaWEB三层架构

    一.MVC设计模式 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controlle ...

  7. LINUX下文件编译

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  8. diffMerge安装配置使用

    概述: 在用git进行源代码版本维护的时候,常常会进行各代码版本之前区别的查看,例如在每次提交改动前进行git diff 可以看到源文件代码相对相应版本或是远程仓库的改动情况,如果有冲突还需要进行me ...

  9. python3 第四章 - 输入与输出

    1.输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. print('hello, world') 输入以上代码,执行后输出: hello, world 事实上,任何基本类型都可 ...

  10. python_14_生成器

    什么是生成器? -- 动态的生成有规律的列表和元组,查询多少才会生成多少数据,不需要时数据不存在 - 大到10几万数据,就省空间了 什么是列表生成式? -- [ handle_i_result for ...