阅读 33

MySQL笔记:索引(纯理论)

索引

索引是为了提高数据查询的效率。在引擎层实现。

常见实现方式:

哈希表:更新很快,等值查询较快,区间查询很慢。适用于Memcached和一些NoSQL

有序数组:等值查询和范围查询较快,使用二分查找。更新很慢。

二叉树:更新查找的效率都很高。

1. N叉树

索引需要存在磁盘中,从磁盘随机读取一个数据块,需要10ms左右的寻址时间。

如果使用二叉树,树高太高,意味着访问磁盘的次数变多,查询会很慢。

使用N叉树,可以减少磁盘访问次数。

数据块

数据块也称数据页,默认大小16KB

通常,根节点数据块在内存中。

2. 索引组织表

InnoDB中,表是根据主键顺序,以索引形式存放,这种存储方式称为索引组织表

每个一索引在InnoDB中对应一颗B+树。

主键索引

叶子节点存的是整行数据。

InnoDB里,主键索引也称为聚簇索引。

如果无主键,使用第一个定义的非Null不重复列,作为聚簇索引。

如果该列不存在,则生成rowid作为聚簇索引。

聚簇索引是指和整行数据存储在一起的索引,找到索引就可以找到整行数据。

非聚簇索引是指和数据分开存储的索引,找到索引之后,通常还得经过回表查询。

查询方式:

只搜索主键所在B+树。

非主键索引

叶子节点存的是主键值。

InnoDB中,非主键索引也称为二级索引。

查询方式:

先搜索普通索引树,得到主键,再到主键树搜索。这个过程称为回表。

应该尽量使用主键查询。

3. 索引维护

为了保证索引有序性,在插入新值时需要做必要的维护。

插入一个新值,可能会导致旧值挪动位置。如果数据页满了,还会导致页分裂。页分裂会使空间利用率降低。

删除数据可能会导致数据页合并。

自增主键的插入模式是追加插入,不会挪动其它记录。

使用自增主键,还能降低非主键索引占用的空间。因为数值型主键值占用内存更小。

4. 覆盖索引

覆盖索引:非主键索引已经覆盖了查询需求,不再需要回表。

优点:可以减少树的搜索次数,提升查询性能。

缺点:如果建立联合索引来支持覆盖索引,会产生维护代价。

5. 最左前缀原则

定义索引(a, b, c)就相当于定义了索引(a), (a, b), (a, b, c)

最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。

联合索引建立原则:

通过调整索引顺序,尽量少的维护多余索引。

如果既要建立联合索引,也要建立一个单字索引,则尽量少的使用空间。

6. 索引下推

MySQL5.6之后,引入了索引下推优化。

在索引遍历过程中,可以对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

文章分类
后端
文章标签