如何创建高效的索引

要让创建的索引真正有效,是需要一个过程的,不是系统上线之前调一下就行了,而是需要在系统运行过程中,不断调整。


(1)考虑索引本身的特性

在前面的文章中,已经说了,索引的3个特性:有序、索引层数不高、索引包含字段值。

第一个特性是有序,可以用到sql中的 分组操作(group by),排序操作(order by),关联(join)上。

第二个特性是索引层数不高,说明当一个表的数据量越来越多的时候,索引层数可能就增加了1-2层,基本上不会影响查询速度,通过索引仍然可以快速查找、过滤数据。

第三个特性是索引包含字段值,说明索引可以起到覆盖查询的目的,也就是说虽然索引不一定起到过滤、快速查找的作用,但是可以直接扫描索引来取数,而非扫描全表,减少了IO操作,速度自然就快了。


(2)针对具体的sql语句,创建索引

注意索引的前缀原则,也就是起过滤作用的字段,尽量放到最左边。

举个具体的例子:

select ID,name,biz_date

from A

where ID = 1000 and name like 'xxx%'

那么可以创建索引:

create index dix_A on A(id,name)


(3)创建完索引后,要监控索引的使用情况

可以通过如下的代码,查询索引使用情况:

create table txt(id int primary key,v varchar(10))  
  
create index idx_txt_v on txt (v)  
  
insert into txt  
values(1,'a'),  
      (2,'b'),  
      (3,'c')  
  
select v  
from txt  
  
  
--idx_txt_v索引中的user_scans会显示1  
--user_updates会显示1  
select   
    DB_NAME(d.database_id),  
    OBJECT_NAME(d.object_id),  
      
    i.name,  
    user_seeks,  
    user_scans,  
    user_lookups,  
      
    user_updates  --通过用户查询执行的更新次数    
from sys.dm_db_index_usage_stats d  
inner join sys.indexes i  
        on d.object_id = i.object_id  
           and d.index_id = i.index_id  
where database_id = DB_ID('test2')  
  
  
--添加数据后,user_updates会显示2  
insert into txt  
values(4,'a'),  
      (5,'b'),  
      (6,'c')  
如果只有user_updates,而没有user_seeks,那么说明创建索引后,只有开销,索引没有起作用。

这种索引,就应该删掉。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值