Hash索引和**B+**树索引
B+树 是最常用于索引的数据结构,时间复杂度低:查找、删除、插入操作都可以可以在 logn 时间内完成。另外一个重要原因存储在 B+树 中的数据是有序的。
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
哈希索引优点:
系索引的工作方式是将列的值作为索引的键值(key),键值相对应实际的值(value)是指向该表中相应行的指针。
哈希索引缺点:
哈希表是无顺的数据结构,对于很多类型的查询语句哈希索引都无能为力;(假如你想要找出所有小于40岁的员工。无法使用使用哈希索引进行查询,因为哈希表只适合查询键值对,也就是说查询相等的查询)
- (1)不支持范围查询
- (2)不支持索引完成排序
- (3)不支持联合索引的最左前缀匹配规则
R索引和位图索引:
R 树通常用来为空间问题提供帮助。例如,一个查询要求“查询出所有距离我两公里之内的麦当劳”,如果数据库表使用R树索引,这类查询的效率将会提高。
位图索引(bitmap index), 这类索引适合放在包含布尔值(true 和 false)的列上。
索引的存储:
库索引是创建在表的某列上的,并且存储了这一列的所有值。但是需要理解的重点是数据库索引并不存储这个表中其他列(字段)的值。举例来说,如果我们在 name 列创建索引,那么 age 列和 address 列上的值并不会存储在这个索引当中。数据库索引同时存储了指向表中的相应行的指针。指针是指一块内存区域, 该内存区域记录的是对硬盘上记录的相应行的数据的引用。因此,索引中除了存储列的值,还存储着一个指向在行数据的索引。
数据库索引的代价
(1)索引会占用空间。你的表越大,索引占用的空间越大。
(2)在更新操作有性能损失。当你在表中添加、删除或者更新行数据的时候, 在索引中也会有相同的操作。