一、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的组合索引:
- create index idx_2 on order(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列。 普通组合索引数据存储结构示例:
Include Column组合索引数据存储结构示例:
SQLServer管理器的SQL优化自动索引推荐就经常看到推荐Include Column方式。 MySQL:不支持,只能用组合索引代替 Oracle:不支持,只能用组合索引代替
|