什么是联合索引?
是指對表上的多個列進行索引,聯(lián)合索引也是一棵B+樹,不同的是聯(lián)合索引的鍵值數(shù)量不是1,而是大于等于2.
最左匹配原則
假定上圖聯(lián)合索引的為(a,b)。聯(lián)合索引也是一棵B+樹,不同的是B+樹在對索引a排序的基礎(chǔ)上,對索引b排序。所以數(shù)據(jù)按照(1,1),(1,2)…順序排放。
對于selete * from table where a=XX and b=XX,顯然是可以使用(a,b)聯(lián)合索引的,
對于selete * from table where a=XX,也是可以使用(a,b)聯(lián)合索引的。因為在這兩種情況下,葉子節(jié)點中的數(shù)據(jù)都是有序的。
但是,對于b列的查詢,selete * from table where b=XX。則不可以使用這棵B+樹索引。可以發(fā)現(xiàn)葉子節(jié)點的b值為1,2,1,4,1,2。顯然不是有序的,因此不能使用(a,b)聯(lián)合索引。
By the way:selete * from table where b=XX and a=XX,也是可以使用到聯(lián)合索引的,你可能會有疑問,這條語句并不符合最左匹配原則。這是由于查詢優(yōu)化器的存在,mysql查詢優(yōu)化器會判斷糾正這條sql語句該以什么樣的順序執(zhí)行效率最高,最后才生成真正的執(zhí)行計劃。所以,當(dāng)然是我們能盡量的利用到索引時的查詢順序效率最高咯,所以mysql查詢優(yōu)化器會最終以這種順序進行查詢執(zhí)行。
優(yōu)化:在聯(lián)合索引中將選擇性最高的列放在索引最前面。
例如:在一個公司里以age 和gender為索引,顯然age要放在前面,因為性別就兩種選擇男或女,選擇性不如age。
總結(jié)
- 上一篇: 什么是最左匹配原则?
- 下一篇: 什么是磁盘io?