1.聯(lián)合索引與最左前綴原則
ALTER TABLE 可以用來創(chuàng)建索引,包括普通索引、UNIQUE索引或PRIMARY KEY索引:
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
ALTER TABLE user_innodb add INDEX comidx_name_phone(name,phone); -- 創(chuàng)建聯(lián)合索引
2. 聯(lián)合索引是怎么組織的
相比于單值索引:
聯(lián)合索引在 B+Tree 中是復(fù)合的數(shù)據(jù)結(jié)構(gòu)
由于 B+樹本身是有序的,所以聯(lián)合索引是從左到右的順序來建立搜索樹的(name在左邊,phone在右邊)。從上圖可以看出來,name是有序的,phone是無序的。當(dāng)name相等的時(shí)候,phone才是有序的。
當(dāng)存儲(chǔ)引擎是InnoDB時(shí),葉節(jié)點(diǎn)存儲(chǔ)的是數(shù)據(jù)/主鍵
3.聯(lián)合索引是怎么查找數(shù)據(jù)的
比如,我們使用 where name=‘Bob’ and phone = ‘132xx’ 去查詢數(shù)據(jù)的時(shí)候
B+Tree 會(huì)優(yōu)先比較 name 來確定下一步應(yīng)該搜索的方向,往左還是往右
如果 name相同的時(shí)候再比較 phone
但是如果查詢條件沒有name,就不知道第一步應(yīng)該查哪個(gè)節(jié)點(diǎn),因?yàn)榻⑺阉鳂涞臅r(shí)候name是第一個(gè)比較因子,所以用不到索引
4.聯(lián)合索引與單值索引什么關(guān)系
假設(shè)我們的項(xiàng)目里面有兩個(gè)查詢很慢:
SELECT * FROM user_innodb WHERE name= ?;
SELECT * FROM user_innodb WHERE name= ? AND phone=?;
按照我們的想法,一個(gè)查詢創(chuàng)建一個(gè)索引,所以我們針對(duì)這兩條SQL創(chuàng)建了兩個(gè)索引,這種做法覺得正確嗎?
CREATE INDEX idx_name on user_innodb(name);
CREATE INDEX idx_name_phone on user_innodb(name,phone);
當(dāng)我們創(chuàng)建一個(gè)聯(lián)合索引的時(shí)候,用左邊的字段name去查詢的時(shí)候,也能用到索引,所以單獨(dú)為name創(chuàng)建一個(gè)索引完全沒必要。相當(dāng)于建立了兩個(gè)聯(lián)合索引(name)、(name,phone)。
如果我們創(chuàng)建三個(gè)字段的索引index(a,b,c),相當(dāng)于創(chuàng)建三個(gè)索引:index(a)、index(a,b)、index(a,b,c)。用 where b=? 和 where b=? and c=? 和where a=? and c=?是不能使用到索引的。因?yàn)椴荒懿挥玫谝粋€(gè)字段,不能中斷。
5.最左前綴原則
?因?yàn)槁?lián)合索引中包含了多個(gè)字段,所以不能像單值索引那樣直接使用就行。那需要遵守什么規(guī)則呢?
答:最左前綴原則:帶頭大哥不能死,中間兄弟不能斷。
https://blog.csdn.net/weixin_43935927/article/details/109491334