索引分类

mysql索引主要分为两类,分别为hash索引b+tree索引;其中hash索引是MEMORY存储引擎默认索引,InnoDB存储引擎和MyISAM存储引擎使用的都是b+tree索引,不过InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应哈希索引。
哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。值得一提的是,Memory引擎是支持非唯一哈希索引的,这在数据库世界里面是比较与众不同的。如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希条目中。
b+tree是mysql使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对hash索引,B+树在查找单条记录的速度虽然比不上hash索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.
如下图(1),innoDb中b+tree所有数据均存储于叶子节点中:
mysql索引学习MyISAM引擎中索引与数据文件相分离,叶节点的data域仅仅存放的是指向数据记录的地址(也叫行指针),在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

myisam与innodb索引区别如下图(2):
mysql索引学习

InnoDB中聚集索引与非聚集索引的区别

聚集索引

主键索引就是聚集索引,模型如上图(1),每个叶子结点存储着数据文件。

非聚集索引

非聚集索引又分为普通索引、唯一索引、组合索引。
普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则,即比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,B-tree会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,B-tree就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,B-tree可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质。组合索引可以无需按照顺序,即index(a,b,c),where c=1 and b=2 and a = 1 数据库引擎会进行适配使用索引,非索引的时候会按照从左到右查询。
非聚集索引也是使用b+tree索引结构,不同于聚集索引的是,非聚集索引的叶子节点不存储具体的数据文件,只存储对应的索引键和主键索引,所以通过非聚集索引查询数据如果查询内容范围不限于索引键值,则会通过主键索引回表查询对应的查询内容,可根据实际情况建立组合索引减少回表,提高查询效率。

相关文章: