码迷,mamicode.com
首页 > 数据库 > 详细

SQL 索引的用法(转)

时间:2015-04-03 10:50:38      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

下面测试的数据是3852916条记录。
测试环境是 os:windows xp sp2, 内存:1G,cpu:双核 2.66 GHZ。

(1)ItemTransaction 表什么都没有,没有主键,没有外键,没有索引。 
declare @d datetime
set @d=getdate()

select * from Itemtransaction
where logdate>‘2008-9-1‘ and logdate<‘2009-7-1‘

select ‘yongshi:‘=datediff(ss,@d,getdate())

用时间:278秒(即:4分39秒)

(2)ItemTransaction 表中只在logdate上创建非聚集索引。

declare @d datetime
set @d=getdate()

select * from Itemtransaction
where logdate>‘2008-9-1‘ and logdate<‘2009-7-1‘

select ‘yongshi:‘=datediff(ss,@d,getdate())

用时间:182秒(即:3分04秒)

快了1分30秒,速度没有想象中的那样快,看来在longdate上建立聚集索引不行。不符合聚集索引的要求“既不能绝大多数都相同,又不能只有极少数相同”。分析一下这张表
数据总数 3852916 ,但是logdate不相同的数据只有360条一年(因为logdate是时间,一天只有一个时间,
一年只有360条。)相比300万的数据来说,只能是极少。一般1:200比较合适。


----------------------------------------------------
(3)ItemTransaction 表中创建一个logdate聚集索引。

  declare @d datetime
set @d=getdate()

select * from Itemtransaction
where  logdate=‘2009-4-1‘ and employeeno=804562132
select ‘yongshi:‘=datediff(ss,@d,getdate())


用时间:45秒

(4)ItemTransaction 表中创建一个logdate,employeeno 的复合聚集索引。

  declare @d datetime
set @d=getdate()

select * from Itemtransaction
where  logdate=‘2009-4-1‘ and employeeno=804562132
select ‘yongshi:‘=datediff(ss,@d,getdate())


用时间:40秒


(5)ItemTransaction 表中创建一个logdate,employeeno 的复合聚集索引。

  declare @d datetime
set @d=getdate()

select * from Itemtransaction
where   employeeno=804562132 
select ‘yongshi:‘=datediff(ss,@d,getdate())


用时间:55秒


通过这三个语句的比较:(3)中只有一个logdate索引,(4)中是logdate和employeeno的符合索引
where 条件都是一样的。查询出来的速度差不多。 但是从(5)中看查询数据慢了。跟(4)比较,只是where 中的条件的先后顺序有所变化,正式这个顺序的变化,引起的。这是因为复合聚集索引中logdate,和employeeno的排列顺序不同。我的排列顺序是logdate 是第一位,employeeno是第二位。当你用的不是符合索引的起始列作为查询条件的话,这个索引的速度会慢下来。
甚至不起作用。


-----------------------------
所谓索引就是在其他地方保存一些键值对,键即所为的索引列,值即地址指针。并且是按照顺序排列的。

(5)employeeTransaction 表中union 和or 的比较

   用or:
  select * from employeetransaction
  where logdate>‘2009-1-1‘ or Prodgroup=‘D1G‘

  用时间:03分:05秒

  用union.
   select * from employeetransaction
   where logdate>‘2009-1-1‘
   union
   select * from employeetransaction
    where Prodgroup=‘D1G‘

  用时间:03分:41秒

在logdate,prodgroup上没有建立索引.看来这两者的速度相差不多.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wobuwei/archive/2009/08/26/4486105.aspx

SQL 索引的用法(转)

标签:

原文地址:http://www.cnblogs.com/760044827qq/p/4389223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!