SQL Server索引的四个高级特性

发表于:2013-3-28 10:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yzsind    来源:51Testing软件测试网采编

  一、Index Building Filter(索引创建时过滤)

  有一些索引非常低效的,比如经常查询状态为进行中的订单,订单有99%的状态是完成,1%是进行中 ,因此我们在订单状态字段上建了一个索引,性能是提高了,但是感觉索引中保存了99%的完成状态数据是永远不会查询到的,很浪费空间。如果我们的索引在建立的时间就不保存完成状态的数据,那不是更好。 Index Building Filter就是用来解决这个问题。

  SQLServer

  支持,语法示例:

create index idx_3 on order(status) where status=’running’

  MySQL:不支持

  Oracle:不支持,可以考虑用分区解决

  二、Index Include Column(索引包含列)

  我们经常需要建一些组合索引,一般有两种原因:

  1、通过组合索引可以提高索引过滤度

  比如订单表有会员ID和订单日期2个字段,如果我们经常要按会员和订单时间查询,

Select * from order where member_id=? and order_date between ? and ?

  那建立会员ID+订单日期的索引很合适。

create index idx_1 on order(member_id,order_date);

  2、索引覆盖读取

  比如我们需要读取一个会员订单的订单ID+状态列表,SQL如下:

select order_id,status from order where member_id=?

  如果我们的索引中只有member_id字段,那么还需要回表查询order_id和status数据才能返回结果,如果建一个member_id+order_id+status的组合索引:

  那只要访问索引就可以返回数据了,这种虽然性能提高了,但是由于索引多了字段,因此增加了索引建立成本和索引空间。

  SQLServer

  SQLServer除了支持组合索引外,还支持Index Include Column特性,Index Include Column是组合索引的一种变种,它的特点是可以指定组合索引中哪些列是排序列,哪些列只是把内容存储在索引中,这个特性不仅可以满足索引覆盖读取,而且可以减少索引对DML的性能影响。语法如:

create index idx_2 on order(member_id) include(order_id,status);

  其中member_id字段是普通索引列,order_id和status列是内容include列。

  普通组合索引数据存储结构示例:

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号