MySQL索引

定义

索引(Index)是帮助MySQL高效获取数据的数据结构。

所以本质上说:索引是数据结构。

在实际中,数据数据本身的组织结构不可能完全满足各种数据结构(例如,二分查找的数据必须有序,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

为什么采取B-树或B+树

索引文件本身也很大,不可能存储在内存中,所以索引往往以索引文件的形式存储的磁盘上。
这样读取数据的时候肯定会有访问磁盘的操作,磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动
这两部分的运动相对于内存读取来讲是非常慢的。所以采取了B树来进行优化。
采取多阶B树
可以构造一个多阶B树,让高度降低,减少磁盘读取次数。

所以什么形式的数据结构可以减少查找过程中磁盘I/O的存取次数,索引采取什么形式的数据结构。

MySQL两种存储引擎

MyISAM索引实现

MyISAM引擎使用B+Tree作为索引结构

MyISAM索引文件仅保存数据的地址,除主索引要求key是唯一的,辅助索引的key可以重复的以外,其主索引和辅助索引在结构上是没有区别的。

InnoDB索引实现

InnoDB表数据文件本身就是主索引,以数据库的表的主键为key搭建B+树(索引InnoDB要求表必须有主键,MyISAM可以没有),叶子节点存储的是数据而不是地址。
InnoDB的辅助索引data域存储的数据是主键的KEY值,也就是说,辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

所以不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大

而且用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

因为磁盘存取与内存存取相比很慢,所以实际中,磁盘读取并不是按需读取的,磁盘会预读,预读的长度一般为页(page)的整倍数,一般4k为一页

按照b树定义,一次访问最多需要访问h个节点,但是因为有上面的预读机制,数据库设计者把一个节点的大小设为一页。每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里。这样一个节点只需要一次I/O就可以查到

参考:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值