mysql索引最左匹配原则的理解6_关于SQL Server索引的最左匹配原则

近期,在交流群中有网友谈到SQL Server索引的最左匹配原则,理解为T-SQL中Where条件的书写顺序的问题,这是一个误解。

下面先看下实验结果。

1

、准备数据。

CREATE TABLE [dbo].[t6](

[id] [int] IDENTITY(1,1) NOT NULL,

[hour] [int] NULL,

[ordernumber] [int] NULL,

CONSTRAINT [PK_t6] PRIMARY KEY CLUSTERED ( [id] ASC )  ON [PRIMARY]

) ON [PRIMARY]

GO

insert into t6 values(default,default)

--

重复执行如下语句,生成10+M记录

insert into t6 select id, hour  from t6

update t6 set

hour=id % convert(int,300000*RAND()+2), ordernumber=id % convert(int,3000*RAND()+2)

2

、创建索引1。

create index fhsy1 on t6(hour, ordernumber)

3

、查看两个字段均为等值查询的执行计划。

select hour,ordernumber from t6 where hour=1 and ordernumber=1

select hour,ordernumber from t6 where ordernumber=1 and hour=1

0ec2866cbf1cf7876de06795cc0350a5.png

83f121068515efa6e8a7024f25bc2319.png

4

、创建索引2。

create index fhsy1 on t6(ordernumber, hour)

5

、再次查看执行计划。

44d2a640bf6a16dfb761fb1b1327cbaa.png

0490572d9cf7003e4a361391a4b9e926.png

6

、再看一下一个字段为等值,另一个字段为范围查询的执行计划。

select hour,ordernumber from t6 where hour=1 and ordernumber between 1 and 2

select hour,ordernumber from t6 where ordernumber between 1 and 2 and hour=1

ca7a9f034688241eb8db988f625b4af7.png

354e7a2750e164130ba252965d1f79f5.png

select hour,ordernumber from t6 where ordernumber=1 and hour between 1 and 2

select hour,ordernumber from t6 where hour between 1 and 2 and ordernumber=1

75e25a75f0b6280d1c04a393d29f1a78.png

933b351526493f4eb92fb66cdd3bf1cf.png

结论

1

、索引的最左匹配,是指的检索条件与索引字段的关系,与在T-SQL语句中Where条件中的书写顺序无关。

索引与搜索条件的书写顺序有关,这在上世纪可能还有可能;现在的数据库引擎的智能化程序,应该可以通过智能优化或语句改写,实现顺序无关。这一点都做不到,这个数据库离淘汰就不远了。

2

、从Cost来看,索引总是匹配等值检索字段在前的复合索引,这就是被称为

最左匹配原则

的原因。

3

、最左匹配索引的执行计划,是Index Seek/Scan,即先通过等值条件进行定位,再通过不等条件进行范围扫描。一般来说,此执行计划要优于Index Scan,即整个索引的扫描。

疑惑

在等值查询中,CBO会自动选择一个Cost最小的执行计划,索引1和索引2相当,最终执行计划选择索引2而不是索引1,原因不明。应该和索引树的高度、统计信息有关。待查。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值