Mysql索引大概有五種類型:
普通索引(INDEX):最基本的索引,沒有任何限制
唯一索引(UNIQUE):與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引(PRIMARY):它 是一種特殊的唯一索引,不允許有空值。
全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可用于innodb表, 用于在一篇文章中,檢索文本信息的, 針對(duì)較大的數(shù)據(jù),生成全文索引很耗時(shí)和空間。
聯(lián)合(組合)索引:為了更多的提高mysql效率可建立組合索引,遵循”最左前綴“原則。
這里我們先來看聯(lián)合索引(組合索引)。
比較簡(jiǎn)單的是單列索引(b+tree)。這個(gè)就不做解釋。
遇到多條件查詢時(shí),不可避免會(huì)使用到多列索引。
我們使用一個(gè)例子來理解聯(lián)合索引的使用方法:
我們來創(chuàng)建一個(gè)表,里邊有五個(gè)字段c1,c2,c3,c4,c5。這個(gè)數(shù)據(jù)表有一個(gè)組合索引(c1,c2,c3,c4)
創(chuàng)建數(shù)據(jù)表:
MariaDB [test]> CREATE TABLE t(
-> c1 CHAR(1) not null,
-> c2 CHAR(1) not null,
-> c3 CHAR(1) not null,
-> c4 CHAR(1) not null,
-> c5 CHAR(1) not null
-> )ENGINE myisam CHARSET UTF8;
Query OK, 0 rows affected (0.09 sec)
添加聯(lián)合索引:
MariaDB [test]> alter table t add index c1234(c1,c2,c3,c4);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
添加幾條數(shù)據(jù):
MariaDB [test]> insert into t VALUES('1','1','1','1','1'),('2','2','2','2','2'),('3','3','3','3','3'),('4','4','4','4','4'),('5','5','5','5','5');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
接下來我們使用MySql Explain開始分析我們各種情況的查詢語句是否用到了聯(lián)合索引。且用到了聯(lián)合索引中的那幾個(gè)元素。
1:效率最高,同時(shí)走四個(gè)索引
(1):按順序?qū)?/p>
explain select * from t where c1 = '1' and c2 = '1' and c3 = '1' and c4 = '1';
(2):不按順序?qū)?,?jīng)過mysql的優(yōu)化,也是走全部索引的
explain select * from t where c3 = '1' and c4 = '1' and c1 = '1' and c2 = '1';
2:最左前綴原則
(1):不走索引
explain select * from t where c2 = '1' and c3 = '1' and c4 = '1';
因?yàn)榻M合索引遵循最左前綴原則,而,我們的組合索引第一個(gè)字段是c1,如果我們的where查詢條件中沒有c1這個(gè)篩選條件,那么mysql默認(rèn)認(rèn)為我們不希望通過索引查詢。
(2):覆蓋部分索引
我們可以對(duì)比上邊兩次查詢的結(jié)果,
explain select * from t where c1 = '1' and c4 = '1';
只走了C1索引,因?yàn)榻M合索引遵循最左前綴原則。
explain select * from t where c1 = '1' and c2 = '1';
這條查詢語句走了C1和C2兩個(gè)索引,同樣,這個(gè)也是最左前綴原則的結(jié)果。
通過上邊的對(duì)比,我們?cè)谑褂寐?lián)合索引的時(shí)候需要注意索引的使用順序問題。
3:當(dāng)查詢條件中有范圍查詢及模糊查詢的情況
(1):第一個(gè)字段使用模糊查詢
explain select * from t where c1 like '3';
(2):第一個(gè)字段使用模糊查詢并且其后邊還有查詢條件的時(shí)候
explain select * from t where c1 like '3' and c2 = '1' and c3 = '1' and c4 = '1';
從上邊的查詢結(jié)果我們可以看出,第一個(gè)字段使用模糊查詢對(duì)之后的查詢條件使用索引是沒有影響的。
(3):使用between關(guān)鍵字范圍查詢
explain select * from t where c1 between '1' and '3' and c2 = '1' and c3 = '1' and c4 = '1';
全索引匹配。
(4):使用“>”“<”進(jìn)行范圍查詢
explain select * from t where c1 > '3' and c2 = '1' and c3 = '1' and c4 = '1';
使用 > < 的時(shí)候,會(huì)對(duì)索引產(chǎn)生影響,通過上邊的查詢結(jié)果我們可以發(fā)現(xiàn)當(dāng)?shù)谝粋€(gè)字段使用范圍查詢之后,后邊的條件便不會(huì)再走索引了。
explain select * from t where c1 = '1' and c2 > '1' and c3 = '1' and c4 = '1';
這次就是走兩個(gè)索引C1和C2。
以上大概就是聯(lián)合索引的基本使用。
有好的建議,請(qǐng)?jiān)谙路捷斎肽愕脑u(píng)論。
歡迎訪問個(gè)人博客
https://guanchao.site