索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以。但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好。索引建少了,用WHERE子句找数据效率低,不利于查找数据。索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。因此要建得恰到好处,这就需要经验了。
一:索引的基本目的
索引的基本目的是在大量数据中找寻少量数据。你可以想像一下,若一本书有700页,就像数据表有700个数据页,而索引却有600个索引页,你会想用索引来查询书籍的内容吗?
索引字段的值重复性越低越好,假设书籍中如“的”“了”这些在文章中重复性极高的字,每页都有一大堆,你会先翻索引页某个位置有“的”,翻回该页读取了“的”之后,再索引看下一个“的”,结果是在先前同一页的不同位置,又翻回书籍原页查看下一个“的”。
那么怎么理解索引是从大量数据中寻找少量数据呢?下面我们举个例子来说明。
如果一个数据表的记录平均长度为400字节,则100万条记录需要5万个数据页,其计算公式如下:
1000000/(8060/400)=50000
如果该数据表建立聚集索引,键值为4个字节长度,而ID的数据长度为13个字节,因此索引结构每条记录为20个字节。
4(聚集索引键值)+13(ID键值)+3(管理信息)=20
以ID字段所建立的索引,100%填充率,则总分页数约为2482页,其计算方式如下:
1000000/(8060/20)
即使是使用80%的填充率来计算也只有3106页。其计算方式如下:
1000000/((8060*0.8)/20)
从上面可以看出如果是第一种情况,则索引页只占到总数据页的5%:
2482/50000=0.04964
即使考虑取每页只填充80%的索引数据,第二种情况,索引页也只是占总数据页的6%: