索引的代价

索引尽可能在业务基础上按需添加,不能无限制地增加索引。
如果索引随意创建,那么它就会在时间和空间上拖后腿。

空间上的代价

每建立一个索引就会创建一棵 B+ 树,B+ 树的每一个节点都是一个数据页,一页默认占据 16KB。一棵 B+ 树由许多页组成。

时间上的代价

每次对表中的数据增、删、改时,都会去修改全部 B+ 树索引。
B+ 树每层节点都是按照索引列的值升序排列,组成了双向列表。不论是叶子节点的记录,还是内节点的记录(用户记录,目录项记录)都是按照索引列的值升序排列,从而形成一个单向链表。
而增、删、改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间记录移位、页面分裂,以便维护节点和记录的排序。
所以,如果我们建立了过多的索引,必然会对性能造成影响(存储引擎需要时间维护节点顺序)。

如何选择索引

只为用于搜索、排序或分组的列创建索引

连表查询的关键字段,order by 或 group by 子句的列上创建索引。

考虑列的基数

列的基数指某一列不重复数据的个数。
比如 type 列,它的值范围是 1 到 3,虽然有很多条数据,但是列的基数始终是 3。
为该列建立索引是没用的,因为相同值出现太多会导致无法比较,所以无法快速查找了。

索引的列尽量小

数据类型越小,占用的存储空间就越少。在一个页可以放更多的记录,从而减少磁盘的I/O 带来的损耗。