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

发布于 2022-09-12 04:23:29 字数 356 浏览 32 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

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

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

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

待"谢繁草 2022-09-19 04:23:29

得不偿失。

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

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

眼泪都笑了 2022-09-19 04:23:29

收藏这个问答

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文