MySQL技术内幕-InnoDB存储引擎读写笔记(索引概述)
2017-07-15 09:31
851 查看
1、InnoDB存储类型表类型
InnoDB存储引擎表类似于Oracle的索引组织表,即使用聚簇索引来组织数据。InnoDB每个表都有一个主键,基于主键的聚簇索引来存放数据(B+树的叶子节点保存数据行,并不是存储数据行的地址)。
如果没有显示的为InnoDB表定义主键:
1)首先表中是否有为空的唯一索引(Unique NOT NULL),如果有,则该列即为主键
2)如果没有,则InnoDB自动创建一个6字节大小的指针。
正因为InnoDB数据的组织方式是按照主键聚簇存放的,加上B+树的特征,故主键的值要求单调递增,这样减少B+树的分裂。归根结底,B+树是一颗排序树,索引具备天生的顺序。
2、InnoDB逻辑存储结构
InnoDB存储引擎的逻辑存储结构与Oracle大致相同,所有数据被逻辑的存放在一个表空间中,表空间由段(segment)、区(extent)、页(page)组成。每个页存放具体的数据行(row)。
3、InnoDB支持Btree(B+)索引与哈希索引
B+树索引的使用
1、什么情况下适合建索引
1)高选择性字段,比如姓名等重复性率比较少的,典型的一般性别等字段,这种字段就没必要建索引。
2)需要遍历的行数比较少。
2、顺序读、随机读、预读取
顺序读:指顺序的读取磁盘上的块(Block)
随机读:访问的块不是连续的,需要磁盘的磁头不断的移动。
在InnoDB存储引擎中,根据主键索引访问范围数据,其顺序只是逻辑有序,物理上并不一定是有序的,只是相对有序,因为一个区包括连续的64页。
3、联合索引
为什么联合索引必须包含第一列的查询条件呢?
因为索引天生是排序的,会先按照第一列排序,然后第二列排序,这样就保证了整个是一个优先序列。
但如果忽略第一列,整个序列就变的没有顺序,故无法使用索引。
例如 (1,1) (1,2) (2,1) (2,4) (3,1) (3,2) 如果不使用第一列,第二列值 1,2,1,4,1,2没有顺序可言,就只能全表扫描
了。
4、索引选择
mysql数据库的优化器会通过explain的rows字段预估查询可能得到的行,如果大于某一个值,则B+树会选择全表的扫描。至于这个值,根据大神的经验,一般是20%,即当取出的数据量超过表中的20%,优化器就不会使用索引,而是全表扫描。为什么会这样呢?
InnoDB的逻辑存储结构与Oracle类似,使用表空间用来存储数据,而且建议每个表使用单独的表空间文件。B+树叶子节点存放数据,每页都有前后两个指针,所以说数据逻辑上是有序的,但在物理上并不是完全有序的,部分有序(因为表空间由段组成,每个段有多个区组成,每个区有连续的页组成,段下的各个区并不是有序的。所有如果通过索引要扫描很多数据,随机IO相对较多,性能低下。而是用全表扫描,采用的是顺序IO读取,虽然数据读取量多,但读取速度快,并不比是用索引花销大。
InnoDB存储引擎表类似于Oracle的索引组织表,即使用聚簇索引来组织数据。InnoDB每个表都有一个主键,基于主键的聚簇索引来存放数据(B+树的叶子节点保存数据行,并不是存储数据行的地址)。
如果没有显示的为InnoDB表定义主键:
1)首先表中是否有为空的唯一索引(Unique NOT NULL),如果有,则该列即为主键
2)如果没有,则InnoDB自动创建一个6字节大小的指针。
正因为InnoDB数据的组织方式是按照主键聚簇存放的,加上B+树的特征,故主键的值要求单调递增,这样减少B+树的分裂。归根结底,B+树是一颗排序树,索引具备天生的顺序。
2、InnoDB逻辑存储结构
InnoDB存储引擎的逻辑存储结构与Oracle大致相同,所有数据被逻辑的存放在一个表空间中,表空间由段(segment)、区(extent)、页(page)组成。每个页存放具体的数据行(row)。
3、InnoDB支持Btree(B+)索引与哈希索引
B+树索引的使用
1、什么情况下适合建索引
1)高选择性字段,比如姓名等重复性率比较少的,典型的一般性别等字段,这种字段就没必要建索引。
2)需要遍历的行数比较少。
2、顺序读、随机读、预读取
顺序读:指顺序的读取磁盘上的块(Block)
随机读:访问的块不是连续的,需要磁盘的磁头不断的移动。
在InnoDB存储引擎中,根据主键索引访问范围数据,其顺序只是逻辑有序,物理上并不一定是有序的,只是相对有序,因为一个区包括连续的64页。
3、联合索引
为什么联合索引必须包含第一列的查询条件呢?
因为索引天生是排序的,会先按照第一列排序,然后第二列排序,这样就保证了整个是一个优先序列。
但如果忽略第一列,整个序列就变的没有顺序,故无法使用索引。
例如 (1,1) (1,2) (2,1) (2,4) (3,1) (3,2) 如果不使用第一列,第二列值 1,2,1,4,1,2没有顺序可言,就只能全表扫描
了。
4、索引选择
mysql数据库的优化器会通过explain的rows字段预估查询可能得到的行,如果大于某一个值,则B+树会选择全表的扫描。至于这个值,根据大神的经验,一般是20%,即当取出的数据量超过表中的20%,优化器就不会使用索引,而是全表扫描。为什么会这样呢?
InnoDB的逻辑存储结构与Oracle类似,使用表空间用来存储数据,而且建议每个表使用单独的表空间文件。B+树叶子节点存放数据,每页都有前后两个指针,所以说数据逻辑上是有序的,但在物理上并不是完全有序的,部分有序(因为表空间由段组成,每个段有多个区组成,每个区有连续的页组成,段下的各个区并不是有序的。所有如果通过索引要扫描很多数据,随机IO相对较多,性能低下。而是用全表扫描,采用的是顺序IO读取,虽然数据读取量多,但读取速度快,并不比是用索引花销大。
相关文章推荐
- MySQL技术内幕-InnoDB存储引擎读写笔记(性能调优)
- MySQL技术内幕-InnoDB存储引擎 笔记
- MySQL技术内幕-InnoDB存储引擎-读书笔记(二)
- MySQL技术内幕 InnoDB存储引擎 第2版
- Mysql技术内幕——InnoDB存储引擎
- MySQL 技术内幕:InnoDB存储引擎pdf
- MySQL技术内幕 InnoDB存储引擎 第2版
- Mysql技术内幕——InnoDB存储引擎
- Mysql技术内幕——InnoDB存储引擎
- MySQL技术内幕-InnoDB存储引擎-读书笔记(一)
- mysql 技术内幕:InnoDB存储引擎
- MySql技术内幕之——InnoDB存储引擎…
- Mysql技术内幕——InnoDB存储引擎
- mysql 技术内幕 Innodb 存储引擎 第二版 学习 first
- MySQL技术内幕 InnoDB存储引擎(二)
- MySql存储引擎InnoDB概述
- MySQL学习笔记——存储引擎的索引特性
- mysql 存储引擎 innodb 学习复习 之 索引
- mysql的存储引擎innodb、myisam对插入影响和索引对插入的影响
- mysql 笔记 六 存储引擎 事务 索引 存储过程