Mysql官方对索引的定义为:索引是帮助Mysql高效获取数据的数据结构,简单来说:索引就是数据结构.
数据库的底层索引是用B树和B+树实现的,但是为什么使用的是它们,为什么不用红黑树?
红黑树等数据结构也可以用来实现索引,但是文件系统以及数据库系统普遍采用B-Tree/B+Tree作为索引结构.这是因为:索引本身也很大,因此索引往往是以索引文件的形式存储在磁盘上.所以,索引查找的过程就会产生磁盘的I/O操作,相比于内存存取,I/O存取消耗要高几个数量级,所以索引的优劣最重要的指标就是在查找过程中的磁盘I/O存取次数.
B-/+的性能分析:
一般使用磁盘I/O次数评价索引结构的优劣.
B树将一个节点的大小设为一个页,每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,计算机存储分配是按页对齐的,就实现了一个node只需要磁盘访问一次,我们可以获得最大数量的数据.所以,B树的深度决定了要访问磁盘I/O的次数.
而红黑树这种结构,h要大的多.由于逻辑上很近的节点物理上可能很远,无法利用其局部性.
为什么B+树更适合外存索引?
因为B+树的内节点去掉了data域,因此有更大的出度,而且它是根据索引关键字进行查找,不经过分支结点,而是沿着下一叶子的指针就可遍历所有的关键字.
mysql简介:
mysql是目前非常流行的开源关系型的数据库,不仅是免费得,可靠性高,速度也比较快,而且拥有灵活的插件式存储引擎.
每个插件式的存储引擎都有各自的特点,能够根据具体的应用建立不同的存储引擎表.每一种存储引擎都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同的功能和能力.
注意:存储引擎是基于表的,而不是基于数据库的.
MYSQL索引:
MyISAM存储引擎不支持事务,表锁设计,支持全文索引.它的另一个与众不同的地方是它的缓冲池只缓冲索引文件,而不缓冲数据文件,数据文件的缓冲交由操作系统本身来完成.
它的索引结构采用B+树作为索引结构,叶子节点的data域存放的是数据记录的地址.所以其数据文件和索引文件是分离的.
搜索过程:
按照B+搜索算法搜索算法搜索索引,如果指定的key存在,取出data的值,然后以data的值作为地址,读取相应的数据记录.
这种索引方式也叫做"非聚集索引".
InnoDB索引:
InnoDB存储引擎支持事务,其设计主要面向在线事务处理的应用,其特点是行锁设计,支持外键,并支持类似Oracle的非锁定读,即默认读取操作不会产生锁.从mysql的5.5.8版本开始,InnoDB就是其默认的存储引擎.
InnoDB索引方式与MyISAM的区别:
InnoDB的数据文件本身就是索引文件.MyISAM数据文件和索引文件分离,但InnoDB的表数据文件本身就是按B+树的组织形成的索引结构,这颗树的叶节点data域保存了完整的数据记录.这个索引的key就是数据表的主键,因此InnoDB表数据文件本身就是主索引.
其叶子节点包含了完整的数据记录,这种索引叫做"聚集索引".