索引

聚簇索引

我们日常所说的主键索引,其实就是聚簇索引(Clustered Index)
  • 索引键为为主键。如果没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。
  • 叶子节点存储:记录的所有列信息,包含整张表的行记录数据。叶子节点包含了所有数据
  • 相当于按照表的主键构造一棵B+树。
 
所以聚簇索引是非常非常快的。因为只用通过一次扫描B+树,就可以找到想要的数据了
 
 
 

 

非聚簇索引

除主键索引外。
我们通常自己建立的唯一索引,索引,前缀索引等全是非聚簇索引。也叫做二级索引/辅助索引
非主键索引的叶子结点存储的则是主键值,以及索引值。
 
由于叶子节点并不存储真实的数据。而是仅仅存储了主键值以及索引值。因此为了获取行的数据,他则会进行一种操作:回表。
也就是通过主键,去聚簇索引走一遍,找到真正的数据行。
也就是聚簇索引可能走10次,非聚簇索引就走了10 + 10 = 20次
 
 
 
那么一定会进行回表操作么。不是
因为非聚簇索引的叶子节点存了 主键 + 索引列。也就是select的数据在里面,就不会进行回表的操作了。
可以参考explain命令里面的extra, using index表示没有进行回表操作
 
 
 
 

前缀索引

前缀索引就是基于原始索引字段,截取前面指定的字符个数或者字节数来做的索引。
比如email,email的字段特别长,可能有40-50位。直接加索引,非常的耗内存。
MySQL 前缀索引能有效减小索引文件的大小,让每个索引页可以保存更多的索引值,,提高索引的速度。
 
 
如图,通过一些计算,发觉email前4位,已经能很好地区分email了。
因此对email的前4位添加,前缀索引。
可以看到explain用了前缀索引,并且索引的key_len只有14。
如果对全部email做索引,key_len有152
 
什么时候需要前缀索引:
当字符串本身可能比较长,而且前几个字符就开始不相同,适合使用前缀索引;相反情况下不适合使用前缀索引,比如,整个字段的长度为 20,索引选择性为 0.9,而我们对前 10 个字符建立前缀索引其选择性也只有 0.5,那么我们需要继续加大前缀字符的长度,但是这个时候前缀索引的优势已经不明显,就没有创建前缀索引的必要了。
 
 
posted @ 2022-09-23 17:31  程序员博博  阅读(127)  评论(0编辑  收藏  举报