索引是数据库系统里面最重要的概念之一。一句话简单来讲,索引的出现实际上是为了提升数据查询的效率,就像书的目录同样。mysql
索引的出现是为了提升查询效率,可是实现索引的方式却有不少种,这里就介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。sql
哈希表是一种以key-value存储数据的结构。经过哈希函数把key换算成一个肯定位置,而后把value放在这个数据的这个位置上。数据库
可是当存储的数据愈来愈多,就有可能出现两个不一样的key经过哈希函数获得了同样的值,这时候就出现冲突。而这时就引入链表来解决这种冲突了。数组
哈希表这种数据结构适用于只有等值查询的场景,时间复杂度为O(1),可是对于范围查找就必须所有遍历了,时间复杂度为O(n)。数据结构
有序数组在等值查询和范围查询场景中的性能很是优秀。函数
可是须要往中间插入时就必需要挪动数据,时间复杂度很高。性能
二叉搜索树在查询和插入、删除数据方面可以中和上面两种结构。查找时间复杂为O(logn)、插入删除的时间复杂度为O(logn)。设计
虽然二叉搜索树的搜索效率很高,可是在大多数的数据库并不使用二叉树。缘由是索引要写在磁盘上。指针
磁盘上的随机读是很耗时间的,为了让一个查询尽可能少地读磁盘,就必须在查询过程当中访问尽可能少的数据块。code
那么就不该该使用二叉树,而是要使用“N”叉树,这里的“N”取决于数据块的大小。
B+树是为磁盘设计的一种平衡查找树。在B+树中,全部记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行链接。
数据库中的B+树索引能够分为主键索引和普通索引两种,也有叫汇集索引(clustered index)和辅助索引(secondary index)
但不论是主键索引仍是普通索引,都是使用B+树的,即高度平衡的,叶子节点存放着全部数据。
InnoDB存储引擎表是索引组织表,即表中数据按主键顺序存放。
主键索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的是行数据。每张表只能拥有一个主键索引。
普通索引与主键索引的区别在于,普通索引的叶子节点并不包含行数据,而是包含主键。
基于主键索引和普通索引的查询有什么区别?
也就是说,基于非主键索引的查询须要多扫描一棵索引树。所以咱们应该尽可能使用主键索引查询。
哈希索引基于哈希表实现,在MySQL中只有Memory引擎显示支持哈希索引,也是Memory引擎表的默认索引类型。
下面是建立Memory引擎表的语句:
CREATE TABLE `testhash` ( `fname` varchar(50) DEFAULT NULL, `lname` varchar(50) DEFAULT NULL, KEY `fname` (`fname`) USING HASH ) ENGINE=MEMORY;
在InnoDB中,某些索引值被使用的很是频繁的时候,它会在内存中基于B+树的基础上再建立一个哈希索引,使其没必要要从根节点就查找。彻底自动的内部行为,用户没法配置或更改。