为什么需要索引?因为索引是用来加快数据访问的,如果你的数据索引设计得不合适的话,或设计得不合理的话,会极大程度上影响我们的性能。注意一点,并不是说索引越多,效率越高。
在进行索引设计的时候,应该保证索引字段占用的空间越小越好,这只是一个大方向,还有一些细节需要注意:
适合所有的列是出现在 where 子句中的列,或者说连接子句中指定的列。也就是我们在进行查询的时候,你在建索引时,并不是所有列都可以随便建索引,只有当做条件查询的时候,那个列当成索引才是最合适的。包括你在进行 join 操作的时候,那个关联列以及 order by 排序的时候,那个列在创建的索引,这个时候才能极大程度上提高我们的数据访问的一个效率。其他没有条件,你这时候建一个索引,没有任何意义,所以不要乱建索引。
基数比较小的表索,引效果差,没必要创建索引。它表示当前这个列里面的唯一值,如果一个表里面有一个状列叫状态列,只有 1,2,3,4 个状态。那意味着你这个表里面不管有多少行记录,你的这个值对应的都是 1,2,3,4。这个时候你想,如果你创建了索引,你按照 1,2,3,4 在进行数据查找的时候,找到都是相同的重复记录。那它能加快你整个数据的查询访问吗?是不是可以的?所以基数越小到表好,索引效果越差,没必要去创建索引,最好是每个值跟每个值都是不重复的。这个时候你创建索引效率是最高的。
在选择索引列的时候越短越好,可以指定某些列的一部分,没必要用全部字段。也就是我们在创建索引的时候,因为 B+ 树这种数据结构的一个特点,要求你在存储索引的时候,那个 Key 列的值越小越好,或者占用的空间越小越好。因为你占用的空间越小,表示你每一个块上面或者页上面能存储更多的数据范围,也就是你能存储更多的数据。这个时候很明显,Key 越小越好。而且如果有时候你写的一个字段是 varchar 类型,长度 20。如果你把 20 个长度都去当做索引了,很明显会占用大量空间,此时我们截取这二十里面的前 5 个或者前 7 个来当作索引,这个时候也是能够进行索引的一个检索的。
不要给表中的每一个字段都创建索引,并不是索引越多越好。你索引越多,你占用的磁盘空间越大,占用的磁盘空间越大。有可能你在进行检索的时候,会导致你的 IO 量就越大,这时候反而会起到一个坏效果,
定义有外界的数据链,一定要创建索引。如果你的业务查询非常复杂,需要进行 n 多个表的表关联。这个时候你的关联操作是非非常麻烦的。因此最好给这些相对应的关联列上面创建的索引,它能够定向的指定到某一行记录,然后进行关联,而不需要每个挨个匹配。
更新频繁的字段不要有索引。这点涉及的是是一个索引维护的问题。我们的索引并不是创建之后就不动了,有可能你需要对索引的值进行修改。一旦你对索引值进行修改了,看起来只是改了一行记录,但是内部里面有可能其他的索引也会引用这个值。那么引发的这个维护的点会非常多,会导致我们的效率降低。所以不要去在频繁更新的字段上面创建我们的索引。
创建索引列不要太多,可以创建组合索引,但是不建议太多。我们在创建索引的时候,一般情况下都是单列的。但是在很多极特殊的情况下,可能要把多个列共同变成一个索引。如果你在创建组合索引的时候,你的字段如果超过 5 个,你的查询效率也会一也会降低。因为在组合索引里面进行数据的一个匹配或者查找的时候,是遵循一个最左匹配原则的。它必须要先匹配第 1 个,再匹配第 2 个,再匹配第 3 个,再匹配第4个,必须要以这样的方式来来创建或者来匹配。那如果你的列更多,那意着越往后的字段必备匹配到的可能性越小。那你后面那些列其实没多大意义了,因此不建议太多, 2~3 个最多了,超过 5 个这种情况千万不要有。
大文本,大对象不要创建索引。比如 text 这样对象千万不要见索引。因为它本身文本内容就占用了很大的空间。你在创建索引,又会额外增加很多的空间,会导致你索引的数据量变得非常小。底层是用 B+ 树,当你的这个字段非常大的时候,会导致你的树变高,而不是变胖。变高之后会增加我们的 IO 次数,影响我们整体系统的一个性能,所以像这些大对象千万不要建索引。