联合索引 : idx_class_name_subject(class,name,subject)

    联合索引对应的B+树,是按照 class、name、subject 的字段来排序的,class相同,再按照name排序,以此类推。

    假设有数据: “1, A, c” 、”1,A,a”、”1, B, b”、”2, C, a” 那么B+树中怎么排呢?

    “1,A,a” 、”1, A, c” 、”1, B, b”、”2, C, a”

    问: select * from where class = “1” and subject = “a” 能使用到索引么? 可以用到几个字段? 为什么?

    能用到 idx_class_name_subject 索引,但是只用到了class ,无法用到 subject。

    为什么无法用到subject 是写本文的目的。

    那么当遇到 class = “1”时 取出

    “1,A,a” 、”1, A, c” 、”1, B, b”、

    此时可以忽略 class 了,因为取出的数据页 class 都相同。
    当 subject = “a”,因为是先按照 name 排序的,再按 subject 排序的。
    有 :”A, a” 、”A, c”、”B、b”

    因 SQL 的where中无 name字段,且可以看到 a,c,b 是乱序的。

    1. // 这里要补充下,数据页间是双向链表、页内是单向链表。页内根据二分查找算法匹配值的。

    那么此时subject 是乱序的,还能用二分查找么? (二分查找的前提是数据有序)
    那么显然是不能了,也就用不到subject字段了。