虽然索引是个好东西,但是不能肆意创建
一、空间上的代价
这个是显而易见的,因为每建立一个索引,都要为他建立一颗B+树。每一颗B+树的每一个节点都是一个数据页。一个数据页默认会占用16KB的存储空间,而一颗很大的B+树由许多数据页组成,这将占用很大的一片存储空间。
为节省空间InnoDB存储引擎只为主键生成默认的索引叫做主键索引或者是聚簇索引,而二级索引需要用户在需要的时候去主动创建,并且二级索引不会存储完整的信息,而是在叶子节点上只存储二级索引值和主键值,并通过回表的方式得到其他列的值。
二、时间上的代价
每当对表中的数据进行增删改(注意没有查询)操作时,都需要修改各个B+树索引。B+树中的每层节点都按照索引列的值从小到大的顺序排序组成了双向列表,无论是叶子节点中的记录还是内节点中的记录(也就是无论是用户记录还是目录项记录),都按照索引列的值从小到大的顺序形成了一个单向列表。而增删改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行页面分裂、页面回收等操作,以维护节点和记录的排序。
还有一点就是在查询语句前,首先要生成一个执行计划。一条查询语句在执行过程中最多使用一个二级索引,在生成执行计划时需要计算使用不同索引执行查询时的成本,选取最优的索引,此时如果建立太多的索引,可能会导致成本分析过程耗时太多,从而影响查询语句的执行性能。
综上所述,在一个表里建立的索引越多,占用的存储空间也就越多,在增删改或者生成执行计划时性能也就越差。
创作不易,点个赞吧~👍
最后的最后送大家一句话
白驹过隙,沧海桑田
与君共勉