sqlserver 索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 索引相关的知识,希望对你有一定的参考价值。

今天看sqlserver想提高一下查询效率。通过浏览发现,所有降低和提高效率的原因都是和索引有关的。
于是想在这里问一下,索引和主键有什么关系,和排序列还有查询条件有什么关系
select * from 表名 这样的查询涉及到索引了么?
如果查询时这个的:
select * from 表名 where 字段 = 条件 又和索引有什么关系
要是出现
select * from 表名 order by 字段 和索引的联系
表格设置索引了和没设置索引查询的效率会有不同么?

索引和主键有什么关系:主键是唯一且非空字段,且主键本身就是个索引,所以无需对主键字段再建索引
select * from 表名 这样的语句用不到索引,索引其实类似于书的目录,你要查的是整个表,所以这目录就起不到作用
select * from 表名 where 字段 = 条件 如果这时候这个字段上有索引,这时一般是会用到索引的,就像你要从一本书中找某个内容,翻目录找到对应的页号,直接翻到这页就可以了
select * from 表名 order by 字段 如果这个字段是有索引的,那么会用这个索引来查找数据,因为按索引查询会比冒泡类算法效率高(没索引的情况下,就是把整表数据取出来,然后用冒泡类算法排除顺序的)

表格设置索引了和没设置索引查询的效率会有不同么?:
查询效率的不同主要就是数据库系统分析你的sql语句后定出的执行路径,如果这个执行路径可以用到你建的索引,那么基本上效率就会比全表扫描来的快
还是那个举例,一本书,有目录页,你查东西的时候是块了还是慢了?追问

有部分提问未提交上
这里重新补充一下
就是如何建立索引
索引的建立是在表格建立前还是后
是否对列内容有要求

追答

如何建立索引:网上自己搜,这是语法问题
索引的建立是在表格建立前还是后:必须先建表,然后此可以再建索引,还是那句话,网上自己搜,这是语法问题,你看了语法就会知道了
是否对列内容有要求:理论来说,所有的类型都可以建索引,但是建议不要再比较长的字符列上建索引,因为这样比较消耗空间。

追问

非常感谢您的训诫,我也去网上搜过的。
在这里询问主要是因为网上要么没有例子要么
例子看不懂

追答

。。。。。。
你找sql server的联机丛书吧
这个是sql server2012的
http://msdn.microsoft.com/zh-cn/library/ms130214.aspx

追问

分只能给一个人,不好意思委屈您了。
您的答案也很精彩,非常抱歉。

参考技术A

    索引的基本结构
    “索引(Index)提供查询的速度”这是对索引的最基本的解释,接下来我们将通过介绍索引的组成,让大家对索引有更深入的理解。 索引是数据库中的一个独特的结构,由于它保存数据库信息,那么我们就需要给它分配磁盘空间和维护索引表。创建索引并不会改变表中的数据,它只是创建了一个新的数据结构指向数据表;打个比方,平时我们使用字典查字时,首先我们要知道查询单词起始字母,然后翻到目录页,接着查找单词具体在哪一页,这时我们目录就是索引表,而目录项就是索引了。
    当然,索引比字典目录更为复杂,因为数据库必须处理插入,删除和更新等操作,这些操作将导致索引发生变化。

    叶节点
    假设我们磁盘上的数据是物理有序的,那么数据库在进行插入,删除和更新操作时,必然会导致数据发生变化,如果我们要保存数据的连续和有序,那么我们就需要移动数据的物理位置,这将增大磁盘的I/O,使得整个数据库运行非常缓慢;使用索引的主要目的是使数据逻辑有序,使数据独立于物理有序存储。
    为了实现数据逻辑有序,索引使用双向链表的数据结构来保持数据逻辑顺序,如果要在两个节点中插入一个新的节点只需修改节点的前驱和后继,而且无需修改新节点的物理位置。

    双向链表(Doubly linked list)也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
    理论上说,从双向链表中删除一个元素操作的时间复杂度是O(1),如果希望删除一个具体有给定关键字的元素,那么最坏的情况下的时间复杂度为O(n)。

    在删除的过程中,我们只需要将要删除的节点的前节点和后节点相连,然后将要删除的节点的前节点和后节点置为null即可。

    索引的类型
    我们知道索引的类型有两种:聚集索引和非聚集索引。
    聚集索引:物理存储按照索引排序。
    非聚集索引:物理存储不按照索引排序。

    了解更多知识点击链接:http://www.jb51.net/article/30971.htm

参考技术B 理论知道讲给你听应该你也很难理解,以下我帮你解释一下吧:

select * from 表名 这样的查询涉及到索引了么?
-----这句话与索引没有关系,但系统会自动按你的索引顺便显示出资料来

如果查询时这个的:
select * from 表名 where 字段 = 条件 又和索引有什么关系
--------这句话如果索引设字了"字段"的话,那麼查询结果的速度会很快
但如果没有设定字段,而设定了其他的索引,那麼会影响这句话的查询速度

要是出现
select * from 表名 order by 字段 和索引的联系

如果order by 的字段正好有设定了索引,并且和索引的排序一致,那麼这句话速度也会很快
相反就会慢

能理解不?追问

首先非常感谢您能将您的经验传授给我。
说的也很清晰,容易理解。有几个问题您未作出解答,我还是存在疑惑的。
估计是我有些愚笨,还有点其他的问题。
主键会默认设置为索引,那么不设置主键如果单纯设置索引?
再有就是我设置主键以外的索引对,数据有什么影响?同时设置索引对数据有什么要求。
最后,我有点好奇理论方面的具体情况,这样对我以后的提高也有帮助。

追答

关於索引的理论网上搜会搜到很多的哦.

主键会默认设置为索引,那么不设置主键如果单纯设置索引?
------如果数据比较单一,不需要进行发布的情况下,不要去设置主键,因为主键本身就是索引,但是主键也同时会影响到资料的新增速度,所以没有必要的情况下不建议设置主键(这是个人经验)

再有就是我设置主键以外的索引对,数据有什么影响?同时设置索引对数据有什么要求。
-----需要设置主键以外的索引,要设定常要用来作查询条件的索引,会对查询速度有很大的帮助
索引的顺序也是根据常用的顺序去设定,例如常常最新的数据会最容易用到,记得时间的索引要加上,而且是倒序哦

追问

非常感谢您的解答。
我临时又出现了新问题非常抱歉。
select id from t wherenum=@num
select id from t with(index(索引名)) wherenum=@num
这么看来似乎和索引列没什么关系为什么下面的可以提高效率
而上面的效率会相对慢?
如果写成
declare @num varchar(40)
set @num = '11'
select id from t wherenum=@num

select id from t wherenum=‘11’
的效率有区别么??

追答

select id from t wherenum=@num
select id from t with(index(索引名)) wherenum=@num
这么看来似乎和索引列没什么关系为什么下面的可以提高效率
而上面的效率会相对慢?
---记住,查询中利用了索引的,效率一定会比没有利用索引要高

如果写成
declare @num varchar(40)
set @num = '11'
select id from t wherenum=@num

select id from t wherenum=‘11’
的效率有区别么??

有一点点区别,不过不会明显
第一句话多了给变量赋值,会稍微慢一下
而第二句直接是个常量,比第一句话要稍微快一点点,但是感觉不到的啦

本回答被提问者采纳

Sqlserver 索引


目地:提高查询效率
分类:

  • 聚集索引(物理),在磁盘中连续的一段存储空间,一个表中只能有一个聚集索引.
  • 非聚集索引(逻辑),一个表中可以有多个非聚集索引

3.增加索引后,会增加额外的存储空间.同时降低了增、删、改的效率。
4.创建表时数据库引擎会自动的将表的主键设置为聚集索引。
5.语法:
创建聚集索引:
create clustered index 索引名称 on 表名称(列名称)
2.创建非聚集索引:
create nonclustered index 索引名称 on 表名称(列名称)
3.删除索引
drop index 表名称.索引名称
4.清除缓存
dbcc dropcleanbuffers

以上是关于sqlserver 索引的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver的索引

sqlserver 日期字段 索引问题

sqlserver索引碎片怎么避免

Sqlserver 关系 索引 约束,如图,这些都啥用?大师。

sqlserver 删除索引时遇到的问题,请高手指教!!!

sqlserver中这样的字段用啥索引比较好?