SQL索引优化

jiajianhui2009 2010-02-02 02:32:01
第一次建立数据库索引,不知道如何合理建立索引。
表字段22个,针对查询建立如下索引:
一个主键字段,一个聚集索引字段,5个非聚集字段。(是不是多了?)
这样做多处查询效率提升,但当对表执行update操作(根据主键更新一条数据)慢的基本上已经死了。
是不是索引建立的不够合理了,该如何优化呢?
...全文
141 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
颠簸在路上 2011-05-23
  • 打赏
  • 举报
回复
up up
nalnait 2010-02-03
  • 打赏
  • 举报
回复
索引太多了
TBAG 2010-02-03
  • 打赏
  • 举报
回复
up 学学
jack15850798154 2010-02-03
  • 打赏
  • 举报
回复
权衡利弊,学习中。。。
jiajianhui2009 2010-02-03
  • 打赏
  • 举报
回复
谁具体的回答下我13楼的问题呀?
fuxiaoyang13 2010-02-03
  • 打赏
  • 举报
回复
学习!!!!!!!!!
jiajianhui2009 2010-02-02
  • 打赏
  • 举报
回复
刚注意到:
为什么我执行update会有3条消息.

--执行
update tab_sales set sale_click_count = 5 where sale_id = '80500f'
--sale_id为唯一主键
/*结果消息
(所影响的行数为 13466 行)


(所影响的行数为 13342 行)


(所影响的行数为 1 行)


*/
忆轩辕 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jiajianhui2009 的回复:]
引用 8 楼 colacat911 的回复:
22个字段5个非聚集索引。。。。。有点多了

有些不是经常会用到的条件字段就不要建索引了

我建了这些索引后明显的某些查询执行快了好多,而且这些查询也很频繁
[/Quote]

那就要权衡写与读了,毕竟索引只对查找有作用(包括带where条件的update语句中查找那一步),但是对写会有影响
mujianhua1982 2010-02-02
  • 打赏
  • 举报
回复
学习了!!!
jiajianhui2009 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 colacat911 的回复:]
22个字段5个非聚集索引。。。。。有点多了

有些不是经常会用到的条件字段就不要建索引了
[/Quote]
我建了这些索引后明显的某些查询执行快了好多,而且这些查询也很频繁
szadv 2010-02-02
  • 打赏
  • 举报
回复
哈哈,学习咯哦。。。
忆轩辕 2010-02-02
  • 打赏
  • 举报
回复
22个字段5个非聚集索引。。。。。有点多了

有些不是经常会用到的条件字段就不要建索引了
Well 2010-02-02
  • 打赏
  • 举报
回复
路过。。
jiajianhui2009 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jaguar_yang 的回复:]
借地一问,索引创建后是立即生效吗?我创建了索引之后查询没有明显效果。
[/Quote]
我的立即生效了
jaguar_yang 2010-02-02
  • 打赏
  • 举报
回复
借地一问,索引创建后是立即生效吗?我创建了索引之后查询没有明显效果。
feixianxxx 2010-02-02
  • 打赏
  • 举报
回复
非聚集索引不需要这么多

如果你是SQL2005
你可以建些 包含列的 非聚集索引
--小F-- 2010-02-02
  • 打赏
  • 举报
回复
---使用索引优化数据库查询效率
1.不宜创建索引的情形
(1)经常插入,修改和删除的表
(2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间

2.适合创建索引的情形
(1)为where子句中出现的列创建索引
(2)创建组合索引
(3)为group by 子句中出现的列创建索引

3.聚集索引的设计原则
(1)该列的数值是唯一的或者很少有重复的记录
(2)经常使用between ...and..按顺序查询的列
(3)定义identity的唯一列.
(4)经常用于对数据进行排序的列.

---无法使用索引的select语句
1.对索引列使用了函数,如:
select * from tb where max(id)=100

2.对索引列使用了'%xx',如:
select * from tb where id like '%1'
需要注意的不是所有使用like关键字的select 语句都无法使用索引,比如
select * from tb where id like '1%'就可以使用索引

3.在where子句中对列进行类型转换(其实也是使用到了函数)

4.在组合索引的第1列不是使用最多的列,如在下面3个查询语句中建立组合索引,按顺序包含col2,col1,id列;
select * from tb where id='1' and col1='aa'
select id,sum(col1) from tb group by id
select * from tb where id='2' and col2='bb'
则第一句和第二句无法使用到索引 所以需要注意组合索引的顺序

5.在where 子句中使用in关键字的某些句子
当在in关键字后面使用嵌套的select语句,将无法使用在该列上定义的索引
如:
select
*
from
ta
where
id
in
(select id from tb where ....)

--这样可以用到索引
select * from tb where id in('1','2')



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2010/01/12/5183068.aspx
jiajianhui2009 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 feixianxxx 的回复:]
经常更新的字段 不要建立索引
[/Quote]
嗯,更新的字段没有做索引
feixianxxx 2010-02-02
  • 打赏
  • 举报
回复
经常更新的字段 不要建立索引

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧