索引
1、索引
索引是帮助MySQL高效获取数据的数据结构。
2、索引的优点
- 提高搜素数据的搜索速度。
- 加快表与表之间的连接速度。
- 在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。
3、索引的缺点
- 创建索引的时候会占用存储空间。
- 在需要修改表中的数据时,索引还需要进行动态的维护,所以对数据库的维护带来了一定的麻烦。
- 在我们建立数据库的时候,需要花费的时间去建立和维护索引,随着数据量的增加,需要维护索引的时间也会增加。
4、索引的分类
从存储结构上划分
- Hash索引
- B-Tree索引
- B+Tree索引
- Full-index全文索引
- R-Tree索引
从应用层次上划分
- 普通索引
- 唯一索引
- 复合索引
从数据的物理顺序与键值的逻辑顺序来划分
- 聚簇索引
- 非聚簇索引
4.1 Hash索引
基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。
4.2 B-Tree索引
B-Tree是最常用于索引的数据结构。因为B-Tree的插入、删除、修改、查找操作都可以在对数时间内完成。并且存储在B-Tree中的数据是有序的。
4.3 B+Tree索引
B+Tree是B-Tree的改进版本。B+Tree的数据都在叶子节点上,并且所有叶子节点形成有序链表,便于范围查询。
4.4 聚簇索引
索引项的排序方式和表中数据记录排序方式一致的索引。所以一个表只能有一个聚簇索引。
聚簇索引的优点
- 数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中。
- 聚簇索引对于主键的排序查找和范围查找速度非常快,因为其数据是按照大小排列的。
聚簇索引的缺点
- 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
- 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
- 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
4.5 非聚簇索引
索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚簇索引。
5、聚簇索引和非聚簇索引的区别
聚簇索引的叶子节点存放的是主键值和数据行,支持覆盖索引。非聚簇索引的叶子节点存放的是主键值或指向数据行的指针。
由于叶子节点(数据页)只能按照一颗B+Tree排序,故一张表只能有一个聚簇索引。非聚簇索引的存在不影响聚簇索引中数据的组织,所以一张表可以有多个非聚簇索引。
6、mysql默认存储引擎的索引建立
mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B-Tree索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。
7、为什么mysql索引结构默认使用B+Tree,而不是B-Tree,Hash,二叉树,红黑树?
- B-tree:因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少,指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
Hash:虽然可以快速定位,但是没有顺序,IO复杂度高。
二叉树:树的高度不均匀,不能自平衡,查找效率跟树的高度成反比,并且IO代价高。
- 红黑树:树的高度随着数据量增加而增加,IO代价高。
8、为什么官方建议使用自增长主键作为索引?
结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。