由于之前做开发并未太多的接触过数据库优化方面的知识,所以对数据库里面的索引知识也只是了解一些皮毛。但最近因为需要,所以恶补了一下这方面的知识,但是看了网上太多关于索引的文章,还是有点似懂非懂的,所以特地来这里向大牛门咨询一下。
问1:我们在设计数据库表时,都会设置一个自增长的int型的ID作为主键,那么这个时候生成主键的同时也会生成一个默认的聚集索引,用来作为物理排序标准。那么这个时候,这张表是不是不能够再创建另外的聚集索引了,因为同一个表只能够有一个聚集索引,如果想要在另外的字段上建聚集索引的话,前题得把默认主建上的聚集索引去掉?
问2:我们在通过Create index创建索引的时候,如果不指定unique|clustered|nonclustered这三个关建字的话,那这个索引是不是就默认为非聚集索引?比如这个语法:create index ix_jobNumber on person (JobNumber asc)
问4:有一个Person表,表里有一千一百万条数据,表内有一Name字段,通过统计,里面共计有132个人名,但每个人名所产生的记录数,少的有3条,多的则有40万条,最常用的查询是软件通过分页查询出Name字段下的某个人名,那么这个字段是否值得建索引?
问5:如果创建一个unique非聚集索引,那个在这个字段下是否能够插入重复的值?

解决方案 »

  1.   

    问1:我们在设计数据库表时,都会设置一个自增长的int型的ID作为主键,那么这个时候生成主键的同时也会生成一个默认的聚集索引,用来作为物理排序标准。那么这个时候,这张表是不是不能够再创建另外的聚集索引了,因为同一个表只能够有一个聚集索引,如果想要在另外的字段上建聚集索引的话,前题得把默认主建上的聚集索引去掉?
    --> 是的.
      

  2.   

    问2:我们在通过Create index创建索引的时候,如果不指定unique|clustered|nonclustered这三个关建字的话,那这个索引是不是就默认为非聚集索引?比如这个语法:create index ix_jobNumber on person (JobNumber asc)
    --> 是的,默认是nonclustered的.
      

  3.   

    问4:有一个Person表,表里有一千一百万条数据,表内有一Name字段,通过统计,里面共计有132个人名,但每个人名所产生的记录数,少的有3条,多的则有40万条,最常用的查询是软件通过分页查询出Name字段下的某个人名,那么这个字段是否值得建索引?
    --> 当然值得建索引.问5:如果创建一个unique非聚集索引,那个在这个字段下是否能够插入重复的值?
    --> 不能插入重复的值,会报错:违反唯一约束.
      

  4.   

    那能不能再请教几个问题,这几个英文名词可不可以大概的讲讲:
    Table Scan
    Index scan
    Index Seek
    对这几个英文名词,不是很了解,Table Scan是表扫描?那其它2个呢?
      

  5.   

    index scan是索引扫描,性能上来说和表扫描无疑,index seek是非聚集索引查找,性能相对快很多。最快的还是聚集索引查找clustered index seek
      

  6.   

    Table Scan --> 全表扫描Index scan --> 索引扫描Index Seek --> 索引查找SQL引擎会自动选择最佳的执行计划.