您的位置:首页 > 数据库 > MySQL

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读取,虽然数据读取量多,但读取速度快,并不比是用索引花销大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: