数据库索引<二> 如何创建索引

  前面一篇说法了索引结构,和几种索引在数据表上的结构,了解了索引可以为查询服务,这篇说一说如何创建索引。

  >平时可能的创建方式

  这个系统中要用到A字段,B字段,C字段做为查询的条件,联接的条件较多,有些地方有A,B组合查询的,有些地方有A,C组合查询的,这些是前提,我大概认为是这样的。到目前为止我看到的同学们建索引都是 A,B,C各建一个索引,下面慢慢说这里有什么问题,也有可能没有问题,得看情况。

  >建索引应该考虑条件(查询,联接等),查询字段,数据的分布

  1)条件,这个很个很是被大家接受,很多都是条件上建索引的。比如下面代码

select * from tb where a>100 and b between 100 and 200;

  那么这个很多同学就会 create index on tb(a),create index on tb(b),如果再来个c可能还会create index on tb(c),这个就和上面所说的情况相似了,那这种建法对不对,可能对,但是这种建法是不动脑筋的建法。这个查询只会用得到一个索引,如果大面积的这样的话,可能有一个索引就是完完全全的浪费的,所在要综合考虑,比如b字段长期是在一个小范围内查询,那么你就直接在b字段上创建就行了。如果a,b重复少,你又追求性能,那么可以create index on tb(b,a)这样子来建,这里有同学可能不明白为什么(b,a),(a,b)不一样吗?是不一样的,看前面我说的条件是b长期是在很小一个内容段的筛选,所以是以b为主导,想相一下,B树节点里面是b,a的一个组合,先按b排序,再按a排序,就像group by b,a 和 group by a,b的结果不一样吧。这一段比较重要的是这样的查询只会用到一个索引,应该说一个查询最多能用到一个索引。

  2)查询字段,这个也就是和select后面部分选哪些字段也是有关系的。比如 

select id from tb where id >100;
select id,col1 from tb where id >100;

  这两个在id为索引条件查询速度是不一样的。但是在 on tb(id) include(col1)的情况下几乎认为一样,当然col1的数据大小也是有关系的,因为大小不同读取的数据页不同。所以说建索引有时也要考虑select后面的字段。

  3)数据的分布,其实这个应该才是这一部分决定性因素。

  比如上面1)所说的情况有多个索引的情况下我们没有显示提示,那么SQLServer会决定选择以哪个索引来查询呢,这个就是与数据分布有关,这里SQLServer会对有索引的表的数据记录统计信息,然后根据统计信息来选择用只个索引。所以在不同时期用到的索引可能不一样。

  >总结
  1.一次查询用到一个索引,当然也有可能一个都不用,也可能你有索引SQLServer也不用。
  2.分清索引键和其它字段的查询有什么不同,这个我感觉我暂是也没说清楚,可以参考前一篇来学习。
  3.存在统计信息这个东西。

原文地址:https://www.cnblogs.com/gw2010/p/3545593.html