原表中endDate 有索引,执行计划走了endDate 的索引,想加一个联合索引,刚开始创建的索引是 partyId,aiipCompanyCode,status,startDate,endDate 这个顺序的联合索引 ,再次查看执行计划 依然选择的是endDate 这个索引,调换了一下联合索引的顺序为status,partyId,aiipCompanyCode,startDate,endDate 就走了新创建的索引,查看数据的话partyId 这个字段的区分度较好,为啥放在最左列却没有用到索引
发一下explain analyze 执行的结果。一个语句默认只能走一个索引,可能查询分析器选择了其他索引。
tidb索引遵循最左匹配原则,否则用不上索引,对于or条件两列的情况,需要开启index merge才能使用到两个列上的索引,所以创建的partyId,aiipCompanyCode,status,startDate,endDate索引因为partyid与aiipcompanycode两个列使用or条件关联的,所以不能单走一个索引;对于status,partyId,aiipCompanyCode,startDate,endDate索引,很有可能只用到了第一列status;以上仅是猜测,具体可以把创建索引后的执行计划发出来。
这个是添加了联合索引之后的执行计划