在关系型数据库中,索引是一种数据结构,将数据提前按照一定的规则进行排序和组织,能够帮助快速定位到数据记录的数据,加快数据库表中数据的查找和访问速度。像书籍的目录,标签等,帮助我们快速定位,可以视为索引。
设计思想就是以空间换时间。
索引的种类
在MySQL中索引是在存储引擎层实现的,而不是服务器层面实现,所以不同存储引擎具有不同的索引类型和实现。常见的索引分类如下:
按数据机构分类:B+tree索引,Hash索引,full-text索引
按物理存储分类:聚集索引,非聚集索引
按字段特性分类:主键索引,唯一索引,普通索引,全文索引
按字段个数分类:单列索引,联合索引(也叫复合索引、组合索引)
常见索引数据结构和区别
区别:树的高度影响获取数据的性能(每一个树节点都是一次磁盘I/O)
1.二叉树
特点:每个节点最多有两个子节,大在左,小在右, 数据随机性情况下树杈越明显。
如果数据是按顺序依次进入:
树的高度则会很高(就是一个链表结构),此时元素的查找效率就等于链表查询O(n),数据检索效率将极为低下。
2.平衡二叉树
通过自旋平衡,子节点会自动分叉为2个分支,从而减少树的高度,当数据有序插入时比二叉树数据检索性能更佳
但是如果数据量过大,节点个数就越多,树高度也会增高,增加磁盘I/O次数,影响查询效率。
3.B-树
B树的出现可以解决树高度的问题。之所以是B树,就是因为它不再限制一个父节点中只能有两个子节点,而是允许M个子节点。不仅如此,B树的一个节点可以存储多个元素,相较于前面的那些二叉树数据结构又将整体的树高度降低了。
4.B+tree索引
在MySQL中为什么会选用B+tree做索引结构
B+tree是在B树基础上的一种优化,更适合做存储索引结构。非叶子结点上仅存储键值,不存储数据;而所有数据记录均存储在叶子节点上,并且数据是按照顺序排列的。此外在B+tree中各个数据页之间是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的。
B+tree结构实现数据索引具有如下优点:
a.非叶子节点上可以存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树也会变得更矮更胖。这样查找数据进行磁盘I/O的次数就会大大减少,数据查询的效率也会更快。
b.所有数据记录都有序存储在叶子节点上,就会使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
c.数据页之间,数据记录之间都是通过链表链接的,有了这个结构的支持就可以方便的在数据查询后进行升序或者降序操作。
InnoDB是MySQL中的一种存储引擎,它会为每个表创建一个主键索引。如果表没有明确的主键索引,InnoDB会使用一个隐藏的,自动生成的主键来创建索引。这个隐藏的主键索引使用的就是B+树结构。因此,在InnoDB中,即使表没有明确的主键索引,也会创建一个B+树索引。
hash索引优缺点
hash索引只能用于等值比较,所以查询效率非常高
不支持范围查询,也不支持排序,因为索引列的分布是无序的。
二级索引是非聚簇索引
覆盖索引就是索引列覆盖了查询字段的意思
索引下推
是在MySQL5.6针对扫描二级索引的一项优化改进,用来在范围查询时减少回表的次数。ICP适用于MYISAM和InnoDB
在二级索引定位到数据之后,一次性回表,不用查到一次回一次表