索引
索引= 排序后的数据结构
在没有索引的情况下我们执行一条sql语句,那么是表进行全局遍历,磁盘寻址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。
用了索引之后,索引的数据结构是二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
索引分类
- 普通索引:仅加速查询
- 唯一索引:加速查询 + 列值唯一(可以有null)
- 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
- 组合(联合)索引:多列值组成一个索引,注意:最左匹配原则
索引创建原则
- 在经常需要 搜索 的列上建索引,这样会大大加快查找速度、
- 在经常需要 连接 的列上建索引,可以加快连接的速度。
- 在经常需要 排序 的列上建索引,因为索引已经是排过序的,这样一来可以利用索引的排序,加快排序查询速度。
- 注意:
那是不是在数据库表字段中尽量多建索引呢?肯定是不是的。因为索引的建立和维护都是需要耗时的
创建表时需要通过数据库去维护索引,添加记录、更新、修改时,也需要更新索引,会间接影响数据库的效率。
索引的优点
创建唯一性索引,保证数据库表中每一行数据的唯一性
大大加快数据的检索速度,这也是创建索引的最主要的原因
加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。
索引的缺点
创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
索引数据结构
- 二叉树 左边子节点比父节点小,右边子节点比父节点大
- 红黑树(平衡二叉树) 左旋和右旋实现自平衡
- Hash 散列
- JDK1.7 (数组+链表)
- JDK1.8 (数组+红黑树) 如果链表长度<=8
hash算法,单个查询, 不支持范围查询,没有排序,所以mysql不适用它.
- B-Tree (多路搜索*–平衡树)
- B+Tree【MySQL使用】
MySQL中的B+Tree
见存储引擎B+Tree。