mysql联合索引支持的匹配原则mysql联合索引的使用规则mysql联合索引支持的匹配原则是




mysql联合索引支持的匹配原则mysql联合索引的使用规则mysql联合索引支持的匹配原则是

2022-07-21 2:26:16 网络知识 官方管理员

最近有人问到这个问题,之前也一直没有深究联合索引具体使用逻辑,查阅多篇文章,并经过测试,得出一些结论

测试环境:SQLServer2008R2

测试结果与MySql联合索引查询机制类似,可以认为MySql是一样的原理

====================================================

联合索引概念:当系统中某几个字段经常要做查询,并且数据量较大,达到百万级别,可多个字段建成索引

使用规则

1.最左原则,根据索引字段,由左往右依次and(where字段很重要,从左往右)

2.Or不会使用联合索引

3.where语句中查询字段包含全部索引字段,字段顺序无关,可随意先后

4.数据量较少时,一般不会使用索引,数据库本身就会自动判断是否使用索引

=====================================================

测试脚本(部分借鉴其他作者的脚本):

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(1)

/*创建测试数据表*/createtableMyTestTable(idvarchar(10)notnull,parentvarchar(40)notnull,addtimedatetimedefault(getdate()),intcolumnintdefault(10),bitcolumnbitdefault(1))go/*添加万条随机字符串测试数据耗时分钟*/declare@countint=3557643declare@iint=0declare@idvarchar(10),@parentvarchar(40)while(@i<@count)beginselect@id=left(newid(),10)if(@i%20=0)beginselect@parent=left(newid(),40)endinsertMyTestTable(id,parent)values(@id,@parent)select@i=@i+1endgo

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(2)

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(3)

/×未建索引查询测试×/declare@beginTimedatetime=getdate()declare@elapsedSecondint=0select*fromMyTestTablewhereparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'andid='FD3687F4-1'select@elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())print'未建立索引时查找数据消耗微秒数'print@elapsedSecondselect@beginTime=GETDATE()select*fromMyTestTablewhereparent='F535C18F-BD48-4D45-88DF-9653BB9B422D'select@elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())print'未建立索引时查找第二列数据消耗微秒数'print@elapsedSecond

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(4)

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(5)

/*建立索引*/ altertableMyTestTableaddconstraintPK_id_parentprimarykey(idasc,parentasc)/*建立索引后的查询*/declare@beginTimedatetime=getdate()declare@elapsedSecondint=0select*fromMyTestTablewhereparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'andid='FD3687F4-1'select@elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())print'建立索引时查找数据消耗微秒数'print@elapsedSecondselect@beginTime=GETDATE()select*fromMyTestTablewhereparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'select@elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())print'建立索引后查找第二列数据消耗微秒数'print@elapsedSecond

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(6)

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(7)

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(8)

/*索引使用测试结论*/select*fromMyTestTablewhereid='FD3687F4-1'--用索引select*fromMyTestTablewhereid='FD3687F4-1'andparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'andintcolumn>0--用索引select*fromMyTestTablewhereid='FD3687F4-1'andintcolumn>0andparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'--用索引select*fromMyTestTablewhereid='FD3687F4-1'andintcolumn>0--用索引select*fromMyTestTablewhereparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'andid='FD3687F4-1'--用索引select*fromMyTestTablewhereparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'andintcolumn>0--不用索引select*fromMyTestTablewhereparent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'orid='FD3687F4-1'--不用索引

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(9)

mysql联合索引支持的匹配原则(mysql联合索引的使用规则)(10)


发表评论:

最近发表
网站分类
标签列表