为什么重复值高的列(比如性别)不能作为索引?

(1)看到一个关于索引的面试题:为什么重复值高的列(比如性别)不能作为索引?
我觉得是因为以这种列作为二级索引的话,那么这颗B+树会以该列的值作为节点的排序标准,如果列值相同就以主键作为排序标准。如果该列重复值低,就可以根据该节点下的列值找到下一层节点。否则若重复值高,难以找到下一层的节点。不知道这么解释对不对?
(2)在二级索引的B+树中,叶子节点存储的是该列值和主键值,非叶子节点存储的是该列值,主键值以及到下一层节点的页号。如果在遍历到非叶子节点时,查询条件中的该列值与该节点记录的列值都相同,那么此时比较的依据是什么呢?主键值吗?如果查询条件中没有加上主键值该怎么办?
(3)在聚簇索引B+树的叶子节点中,每一个节点记录的是同一数据页下的全部记录数吗?还是说是部分记录?

阅读 4.7k
4 个回答
  1. 维护索引会消耗资源,二级索引查询需要进行回表操作,那么重复性高的数据效率就无法获取索引带来的好处(因为大家都一样,也就不需要寻找了),还不如一行一行扫描的效率高
  2. 没怎么看懂。主键信息应该只存在叶子节点上。你说的是可能是多个条件查询语句?有主键条件就直接通过聚簇索引获取行信息再对比条件,如果只有二级就回表查询行再对比条件
  3. 聚簇索引的叶子节点包含该行的数据,而你说的数据页大小是固定的,为管理磁盘最小size,数据页中存储会包含多行数据(节点)。

关键应该还是 区分度小,就是加了索引,需要扫描的行数还是很多,效率不高,但是建索引是需要代价的。

b+tree 中只要主键索引存的是每条详情记录,普通索引存的是主键值。

得不偿失。

索引就像目录一样,是提供给你精准定位,加快查询速度的,一本书有半本厚都是目录,每次查询翻目录都要翻半天(遍历数据),那这目录还有什么作用?除非使用limit查少量数据,这样还索引还是有一定作用的。

而且索引还会占用磁盘空间,降低数据的更新速度。

收藏这个问答

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题