问:表建立联合索引(a,b,c),查询条件a=1,b>2,c=3,此时为什么c条件的索引会失效?
答:简单点来说,该组合索引是一个以a字段排序而b与c相对有序的B+树,引擎可以通过二分查找定位到a=1的数据,b在a=1确定得情况下是有序的(所以b的有序是相对的),依然可以通过二分查找取出所有b大于2的数据,但这些数据的b字段可能有很多个不同的值,所以c字段是无序的,无法用二分查找来查询c=3的数据,故c用不到索引。
例如存在索引数据如下
(a=1,b=3,c=3),(a=1,b=4,c=0),(a=1,b=4,c=3),(a=1,b=4,c=0)
上述数据均满足a=1&b>2,但是c的数据却不是连续的,所以没有办法通过c索引进行过滤,所以字段c并不能够参与到索引刷选中。