sqlserver数据库索引深解

来源:互联网 发布:路由器有线网络不稳定 编辑:程序博客网 时间:2024/06/10 01:41

数据库数据基本单位是页
插入数据,是看当前页有没有空间,如果有的话,就在当前页插入数据,没有空间了,就新建页(比较耗时)
对于有聚集索引的表,存在从中间插入数据,比如id列为1,5,7,8,我要插个6进去,就可能要重新排列页里面的数据,这个问题可以用填充因子来解决,填充因子就是每个页每行数据空出点空间,用来插入新数据,当然有填充因子的话,要多耗一些磁盘空间.
8个连续页为一个区
http://msdn.microsoft.com/zh-cn/library/ms190969(SQL.90).aspx
msdn library -->sql server -->sql server 2005 -->文档-->联机丛书-->数据库引擎
-->高级数据库引擎详细信息-->物理数据库体系结构

堆数据
如果一个表没有索引的话,数据的存放是无序的,查寻就要遍历全表
http://msdn.microsoft.com/zh-cn/library/ms188270(SQL.90).aspx
msdn library -->sql server -->sql server 2005 -->文档-->联机丛书-->数据库引擎
-->高级数据库引擎详细信息-->表和索引体系结构
索引
有很多重复数据的列,跟没有重复数据的列,并不存在是否适合索引的问题
只是对于像只有0,1这种列,msdn说,不做索引也是一样
索引结构是B树的形式(两叉或多叉)
http://msdn.microsoft.com/zh-cn/library/ms177443(SQL.90).aspx
从另一本书上得知,具体结构大概是这样,比如搜索id=53的记录,一共有200条记录
聚集索引
结合msdn的图
先在根页看53属于哪行,根页的行应该是这样的
根页数据
0-100
100-200

53是属于0-100,所以会连接到中间级的一个页,类似如下
中间级的页是这样的
0-50      
51-100
然后又会到下一页,如
51-60
61-70
71-80
81-90
91-100
最最后,选到了53,聚集索引的好处就是也许相邻的地址就是数据存放地址了,而非聚集索引则
要通过对应的内存地址再去堆里找数据

所以,就算是聚集索引,也不可能像人一样,在100条数据立刻定位1或100这种记录
msdn建议把索引建立在很少重复的字段上,其实从算法本身看,如果有多重复字段应该
更容易找到叶节点,只是数据库会给每行字段加一个隐性的字段,就来区分唯一性
http://msdn.microsoft.com/zh-cn/library/ms190639(SQL.90).aspx
http://msdn.microsoft.com/zh-cn/library/ms190969(SQL.90).aspx
msdn library -->sql server -->sql server 2005 -->文档-->联机丛书-->数据库引擎
-->设计和创建数据库-->索引

组合索引,复合索引和宽索引
不管从sql2000到2008相关的说明真是好,好像MS不建议大家用这个一样,不过可以想像
只要是索引就一定涉及排序,如果两个字段排序,就一定有一个字段是主要标准,从大部分
非官方文章来看,如果a,b是组合索引
那么 where b=1 这种语句就用不上这个索引,用上的有
where a=1 and b=1 或 where a=1
由此可见,复合索引的主要排序标准还是第一个字段