请教 mssql 数据表 如何合理创建索引,是分开建还是合在一起建,见下面条件

时间:2021-11-17 14:36:24
我有一个数据表,
自增id常用,我使用了主键,
还有a-z各类型的一堆字段,
如果经常使用a、b、c、d做查询条件,用e、f、g做排序条件
该怎么建立索引呢,
是a/b/c/d/e/f/g各建一个索引,
还是a/b/c/d各建一个索引,e/f/g合建在一个索引上
还是a/b/c/d/e/f/g都合建在一个索引上呢,
请教 mssql 数据表 如何合理创建索引,是分开建还是合在一起建,见下面条件请教 mssql 数据表 如何合理创建索引,是分开建还是合在一起建,见下面条件
他们各自有什么区别,性能上有什么影响?
大侠们,不考虑小数据,视为单表数据在1w以上。

还有,如果数据库有100个表,在每个表的查询字段和排序字段上都建立索引会降低数据库性能吗???
请各位大侠赐教,望普及我等小白,奉上100分。

13 个解决方案

#1


各位大写,初次论坛发帖所以结贴率是0,别误会,一定及时处理

#2


如果经常使用a、b、c、d做查询条件

你的查询条件是组合的,还是单个字段的,比如:

where a = xx 
where b = yy
。。。

还是:where a=xx and b=yy and c = zz

#3


如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)

#4


每个字段建索引还是多个字段建在一个索引上,要看你是经常单个条件查询,还是会进行多个条件组合查询,如果多个条件组合查询,那么建议多个字段建在一个索引上

#5


引用 3 楼 yupeigu 的回复:
如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗

#6


引用 5 楼 rbgang 的回复:
Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

#7


当然,按照上面的规则建立索引,不过还是要建立尽量少的索引,因为索引建多了,会导致insert、update等操作的开销增大,降低性能。

还有,在建立了索引后,可以通过如下的查询,来查询索引的使用的情况:

select *
from sys.dm_db_index_usage_stats


如果,对index_seek的次数,很小,那么可以考虑删除这个索引,再尝试建立其他的索引,如此多次,就能建立真正让查询使用的索引,让这些索引都能发挥作用,同时尽量减少索引的数量

#8


引用 6 楼 yupeigu 的回复:
Quote: 引用 5 楼 rbgang 的回复:

Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

那像 where a=x and b=y and c=z order by f,g,h这样的
排序字段是单独建立索引还是和条件字段一起组合建立索引呢

#9


当一个表只有少数几列时,单独创建索引并没有什么严重的错误,但是当表的列很多时,由于存储、维护的原因,不建议单独建索引,很多副作用都是因为存储和维护开销导致的。

#10


引用 8 楼 rbgang 的回复:
Quote: 引用 6 楼 yupeigu 的回复:

Quote: 引用 5 楼 rbgang 的回复:

Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

那像 where a=x and b=y and c=z order by f,g,h这样的
排序字段是单独建立索引还是和条件字段一起组合建立索引呢


可以建立索引:

(a,b,c,f,g,h)

#11


引用 9 楼 DBA_Huangzj 的回复:
当一个表只有少数几列时,单独创建索引并没有什么严重的错误,但是当表的列很多时,由于存储、维护的原因,不建议单独建索引,很多副作用都是因为存储和维护开销导致的。

谢谢提醒,一定注意

#12


引用 10 楼 yupeigu 的回复:
Quote: 引用 8 楼 rbgang 的回复:

Quote: 引用 6 楼 yupeigu 的回复:

Quote: 引用 5 楼 rbgang 的回复:

Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

那像 where a=x and b=y and c=z order by f,g,h这样的
排序字段是单独建立索引还是和条件字段一起组合建立索引呢


可以建立索引:

(a,b,c,f,g,h)

收到,谢谢

#13


如果你不知道怎么建,可以把所有索引去掉(可以先保留索引的定义),然后在查询界面右键→【在数据库引擎优化顾问中xxx】那个,然后直接点开始分析,应该会有一些建议,不过仅供参考

#1


各位大写,初次论坛发帖所以结贴率是0,别误会,一定及时处理

#2


如果经常使用a、b、c、d做查询条件

你的查询条件是组合的,还是单个字段的,比如:

where a = xx 
where b = yy
。。。

还是:where a=xx and b=yy and c = zz

#3


如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)

#4


每个字段建索引还是多个字段建在一个索引上,要看你是经常单个条件查询,还是会进行多个条件组合查询,如果多个条件组合查询,那么建议多个字段建在一个索引上

#5


引用 3 楼 yupeigu 的回复:
如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗

#6


引用 5 楼 rbgang 的回复:
Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

#7


当然,按照上面的规则建立索引,不过还是要建立尽量少的索引,因为索引建多了,会导致insert、update等操作的开销增大,降低性能。

还有,在建立了索引后,可以通过如下的查询,来查询索引的使用的情况:

select *
from sys.dm_db_index_usage_stats


如果,对index_seek的次数,很小,那么可以考虑删除这个索引,再尝试建立其他的索引,如此多次,就能建立真正让查询使用的索引,让这些索引都能发挥作用,同时尽量减少索引的数量

#8


引用 6 楼 yupeigu 的回复:
Quote: 引用 5 楼 rbgang 的回复:

Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

那像 where a=x and b=y and c=z order by f,g,h这样的
排序字段是单独建立索引还是和条件字段一起组合建立索引呢

#9


当一个表只有少数几列时,单独创建索引并没有什么严重的错误,但是当表的列很多时,由于存储、维护的原因,不建议单独建索引,很多副作用都是因为存储和维护开销导致的。

#10


引用 8 楼 rbgang 的回复:
Quote: 引用 6 楼 yupeigu 的回复:

Quote: 引用 5 楼 rbgang 的回复:

Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

那像 where a=x and b=y and c=z order by f,g,h这样的
排序字段是单独建立索引还是和条件字段一起组合建立索引呢


可以建立索引:

(a,b,c,f,g,h)

#11


引用 9 楼 DBA_Huangzj 的回复:
当一个表只有少数几列时,单独创建索引并没有什么严重的错误,但是当表的列很多时,由于存储、维护的原因,不建议单独建索引,很多副作用都是因为存储和维护开销导致的。

谢谢提醒,一定注意

#12


引用 10 楼 yupeigu 的回复:
Quote: 引用 8 楼 rbgang 的回复:

Quote: 引用 6 楼 yupeigu 的回复:

Quote: 引用 5 楼 rbgang 的回复:

Quote: 引用 3 楼 yupeigu 的回复:

如果是这种:

where a = xx 
where b = yy
。。。

那么最好是给a,b,c,d每个字段,分别建立索引。

如果是:where a=xx and b=yy and c = zz
那么可以建立一个索引:create index idx_xxx on 表(a,b,c,d)


既有单独的,也有组合的,组合的多一些,
既有a=x and b=y and c=z
也有b=y and d=m 这样不同字段的组合查询,要给同一个字段建立多个索引吗


这样就得建立多个索引了,比如(a,b,c) ,还有(b,d),建立2个索引

那像 where a=x and b=y and c=z order by f,g,h这样的
排序字段是单独建立索引还是和条件字段一起组合建立索引呢


可以建立索引:

(a,b,c,f,g,h)

收到,谢谢

#13


如果你不知道怎么建,可以把所有索引去掉(可以先保留索引的定义),然后在查询界面右键→【在数据库引擎优化顾问中xxx】那个,然后直接点开始分析,应该会有一些建议,不过仅供参考