博文

数据库中索引原理(超经典)(2012-08-02 22:52:00)

摘要:实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:

其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

如果您认识某个字,您可以快速地从字典中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能......

阅读全文(4629) | 评论:6

数据库索引的概念(2012-08-02 22:51:00)

摘要: 一、索引的概念
索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
二、索引的特点
1.索引可以加快数据库的检索速度

2.索引降低了数据库插入、修改、删除等维护任务的速度
3.索引创建在表上,不能创建在视图上
4.索引既可以直接创建,也可以间接创建

5.可以在优化隐藏中,使用索引
6.使用查询处理器执行SQL语句,在一个表上,一次只能使用一个索引

7.其他
三、索引的优点
1.创建唯一性索引,保证数据库表中每一行数据的唯一性
2.大大加快数据的检索速度,这也是创建索引的最主要的原因
3.加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。
四、索引的缺点
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
五、索引分类
1.直接创建索引和间接创建索引
直接创建索引:
CREATE INDEX mycolumn_index ON mytable
(myclumn)
间接创建索引:定义主键约束或者唯一性键约束,可以间接创建索引
2.普通索引和唯一性索引
普通索引:CREATE INDEX
mycolumn_index ON mytable
(myclumn)......

阅读全文(3341) | 评论:1

[转载]漫谈数据库索引(2012-08-02 22:50:00)

摘要: 一、引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助。有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。[最近首页之争沸沸扬扬,也不知道这个放在这合适么,苦劳?功劳?……] 二、B-Tree 我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。所以在最开始,简单地介绍一下B-Tree。 B-Tree不同于Binary Tree(二叉树,最多有两个子树),一棵M阶的B-Tree满足以下条件:
1)每个结点至多有M个孩子;
2)除根结点和叶结点外,其它每个结点至少有M/2个孩子;
3)根结点至少有两个孩子(除非该树仅包含一个结点);
4)所有叶结点在同一层,叶结点不包含任何关键字信息;
5)有K个关键字的非叶结点恰好包含K+1个孩子; 另外,对于一个结点,其内部的关键字是从小到大排序的。以下是B-Tree(M=4)的样例: 对于每个结点,主要包含一个关键字数组Key[],一个指针数组(指向儿子)Son[]。在B-Tree内,查找的流程是:使用顺序查找(数组长度较短时)或折半查找方法查找Key[]数组,若找到关键字K,则返回该结点的地址及K在Key[]中的位置;否则,可确定K在某个Key[i]和Key[i+1]之间,则从Son[i]所指的子结点继续查找,直到在某结点中查找成功;或直至找到叶结点且叶结点中的查找仍不成功时,查找过程失败。 接着,我们使用以下图片演示如何生成B-Tree(M=4,依次插入1~6):
从图可见,当我们插入关键字4时,由于原结点已经满了,故进行分裂,基本按一半的原则进行分裂,然后取出中间的关键字2,升级(这里是成为根结点)。其它的依类推,就是这样一个大概的过程。 三、数据库索引 1.什么是索引 在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小......

阅读全文(3661) | 评论:0

关于Sql Server 2008添加管理员并设置对应权限(2011-09-02 14:56:00)

摘要:首先打开数据库,并以windows身份验证模式扥牢固数据库,如图: 然后在左侧的【对象资源管理器中】展开【安全性】节点,鼠标右键点击节点中的【登录名】,在弹出的菜单中单击【新建登录名】,弹出如图对话框:

如上图中: 1. 在登录名右侧的文本框中输入新建的管理员账号名称; 2. 一对单选按钮组中,选择Sql Server 身份验证,并输入登录密码; 3. 勾选强制实施密码策略复选框;(密码策略一般是指加强用户登录的密码方式例如:可能需要至少8个以上字符,或在尝试若干登陆失败后该账号即被禁止登陆等等!如果觉得麻烦可以不必勾选!) 4. 不勾选强制密码过期;(如果勾选该项的话,则每一次登陆后系统都会提示用户必须更改现有密码,如非特殊需求,不建议勾选此项!) 然后继续点选左侧选项页下的【服务器角色】,如图:
在右侧的服务器角色面板中,勾选 public 和 sysadmin 两项! 注意:如果建立的账号不需要具备系统管理员的权限时,则不要勾选 sysadmin 项! 继续点选左侧选项页中的【用户映射】,如图:
在右侧的面板中勾选该账号可以进行管理操作的数据库名称!并在该面板下面的【数据库角色成员身份】中勾选 db_owner 项!如图:
注意:如果给一个无系统管理权限的账号指定管理一个数据库时,则一定要勾选 db_owner 项!否则该账号则无法看到该数据库中的任何数据表! 选后点选【选择页】下的【状态】选项进行设置,如图:
至此,一个新的数据库管理员已创建完成! 其实,对于专业的DBA管理者来说,T-Sql语句的操作要比这种图形界面闯建账号来得更快更灵活!......

阅读全文(3210) | 评论:0

如何识别 SQL Server 的版本(2011-08-29 18:02:00)

摘要:本文介绍如何识别当前的 Microsoft SQL Server 版本号和相应的产品或 Service Pack 级别。同时介绍如何识别正在使用的 SQL Server 具体版本。回到顶端 如何确定正在运行的 SQL Server 2008 为哪个版本 loadTOCNode(2, 'summary'); 若要确定正在运行的 SQL Server 2008 为哪个版本,请使用 SQL Server Management Studio 连接到 SQL Server 2008,然后运行下列 Transact-SQL 语句。 SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') 运行结果如下: 产品版本(例如,10.0.1600.22)产品级别(例如,RTM)版本(例如, Enterprise) 例如,运行结果可能类似于如下内容。 收起该表格展开该表格 10.0.1600.22 RTM Enterprise Edition 下表列出了 Sqlservr.exe 版本号。 收起该表格展开该表格 版本 Sqlservr.exe RTM 2007.100.1600.0 SQL Server 2008 Service Pack 1 2007.100.2531.0 回到顶端 如何确定正在运行的 SQL Server 2005 为哪个版本 loadTOCNode(2, 'summary'); 若要确定正在运行的 Microsoft SQL Server 2005 的版本,请使用 SQL Server Management Studio 连接到 SQL Server 2005,然后运行以下 Transact-SQL 语句。 SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel')......

阅读全文(1926) | 评论:1

数据库三范式,轻松理解(2010-10-20 19:43:00)

摘要:网上搜罗了一大堆关于数据库范式理解的文章,都是千律一篇的复制粘贴,连例子都是一模一样,拜托有点创意好不,实在看不下去,自己写一篇个人理解三范式的文章。如果有理解上的不正确之处,请联系我:279537592#qq.com (#=>@) 官方定义:第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。
我的理解:第一范式这个不用說了,只要是关系数据库都满足第一范式 官方定义:第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖
我的理解:在第二范式中组合主键(AB)【注明:也叫做复合主键】里面的A或者B 与其他字段不能存在组合重复,为解决这个问题,通常的做法是咱们不用组合主键,添加一个ID,做为单一主键即可满足第二范式。如果不想添加ID,请满足组合主键(AB)里面的A或者B 与其他字段不能存在组合重复。
如:不满足第二范式,复合主键中的A与字段C组合重复......

阅读全文(1676) | 评论:0

详解SQL Server数据库索引(2010-10-20 14:43:00)

摘要:  一、理解索引的结构   索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。   SQL Server 中数据存储的基本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。   下面我们先简单的了解一下索引的体系结构:   1. 聚集索引结构   在 SQL Server 中,索引是按 B 树结构进行组织的。   聚集索引单个分区中的结构:   --建立UserAddDate聚集索引   CREATE CLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]
  (
  [UserAddDate] ASC
  )   聚集索引(Clust......

阅读全文(2848) | 评论:1

sql之left join、right join、inner join的区别(2010-05-14 16:49:00)

摘要:sql之left join、right join、inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下:
--------------------------------------------
表A记录如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115 表B记录如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408 --------------------------------------------
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID 结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL (所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.......

阅读全文(1513) | 评论:0