一、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列。

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