选择性低但经常出现在where条件中的字段到底要不要建索引?

Powertion 2017-04-27 06:57:27
选择性低(指字段值种类比较少,比如性别字段只有男、女)
但经常出现在where条件中的字段到底建不建索引?
疑惑
...全文
1740 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gentleman♥️ 2019-02-22
  • 打赏
  • 举报
回复
不太建议建,索引同样会占用硬盘空间的,数据量很大的时候,也是很恐怖的,再从另外一个方面说下 我的观点,这是因为这样的数据会分散在几乎所有的数据页中,这样的话,其实就是要把所有的数据页都加载到内存中了,这样的话,如果走索引,也是同样要加载所有的数据页到内存中,那索引这个步骤不就是多余了吗,要知道,索引中存在的数据,是在每一个个数据页中的,一个数据页会存有相应索引范围的一批数据的,而数据页是存放在硬盘上的
中国风 2017-04-28
  • 打赏
  • 举报
回复
不建议建,意义不大
当数据达到一定值时,都会走表扫描,是否走索引要看男/女在表占用的比例
在SQL2005时计算选择性的比例为 满足条件的行数/总行数<=0.7181,会走索引,其它会走表扫描,需要考虑特殊情况比如表数据量小<64K,SQL2012之后的版本是用列存储计算大小方式又有所不同
参照选择性就行了,有兴趣可以自己去不同版本中去测试,意义不大,掌握大概就行了
Powertion 2017-04-28
  • 打赏
  • 举报
回复
sqlserver文档说: 设计索引时,应考虑以下查询准则: 为经常用于查询中的谓词和联接条件的所有列创建非聚集索引。 又说: 在列中检查数据分布。通常情况下,为包含很少唯一值的列创建索引或在这样的列上执行联接将导致长时间运行的查询。 有一种说法(非官方),通过建立提高选择性的组合索引
卖水果的net 2017-04-28
  • 打赏
  • 举报
回复
这种情况,应该和其他的查询条件用到的字段,建立联合索引,而不是建立单列索引; 比如这样的查询比较多: select * from t where crdate > '2017-01-01' and sexid = '男' 可以建立如下索引: create index ix_t on t(crdate, sexid)
Powertion 2017-04-27
  • 打赏
  • 举报
回复
谢回答,我有几个字段长期固定要与另外一张表做关联,其中有两个字段的选择性相当低,基本上就是五五开了,是否也适用这种情况不用建索引?怎么总感觉关联字段都要建上索引呢
专注or全面 2017-04-27
  • 打赏
  • 举报
回复 1
看情况,举个例子,如果仅仅是男女,数据55开的,或者是只有1,2,3三种状态的且相对平均分布的,这种情况下索引是没用的(用不到的) 如果可以根据筛选条件过滤出来一个小的结果集,当然可以建索引 比如表中状态位有1,2,3,4,5,6,7,8,9等等,3,4,5,6,7,8,9占据了大部分数据,1,2只有少部分数据,当然可以在这个字段上建索引 对于3,4,5,6,7,8,9的查询可能不适用与索引查询,但是对于1,2就适合索引查找,那么此时建立个索引页无可厚非。
专注or全面 2017-04-27
  • 打赏
  • 举报
回复
看情况,举个例子,如果仅仅是男女,数据55开的,或者是只有1,2,3三种状态的,正常情况下是没用的 如果可以根据筛选条件过滤出来一个小的结果集,当然可以建索引 比如表中状态位有1,2,3,4,5,6,7,8,9等等,3,4,5,6,7,8,9占据了大部分数据,1,2只有少部分数据,当然可以在这个字段上建索引 对于3,4,5,6,7,8,9的查询可能不适用与索引查询,但是对于1,2就适合索引查找,那么此时建立个索引页无可厚非。

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧