Mysql索引大概有五種類型:
普通索引(INDEX):最基本的索引堰酿,沒有任何限制
唯一索引(UNIQUE):與"普通索引"類似役首,不同的就是:索引列的值必須唯一绑咱,但允許有空值爵嗅。
主鍵索引(PRIMARY):它 是一種特殊的唯一索引,不允許有空值疲恢。
全文索引(FULLTEXT ):可用于 MyISAM 表凶朗,mysql5.6之后也可用于innodb表, 用于在一篇文章中显拳,檢索文本信息的, 針對較大的數據棚愤,生成全文索引很耗時和空間。
聯合(組合)索引:為了更多的提高mysql效率可建立組合索引杂数,遵循”最左前綴“原則遇八。
這里我們先來看聯合索引(組合索引)。
比較簡單的是單列索引(b+tree)耍休。這個就不做解釋。
遇到多條件查詢時货矮,不可避免會使用到多列索引羊精。
我們使用一個例子來理解聯合索引的使用方法:
我們來創(chuàng)建一個表,里邊有五個字段c1,c2,c3,c4,c5。這個數據表有一個組合索引(c1,c2,c3,c4)
創(chuàng)建數據表:
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)
添加聯合索引:
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
添加幾條數據:
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開始分析我們各種情況的查詢語句是否用到了聯合索引喧锦。且用到了聯合索引中的那幾個元素读规。
1:效率最高,同時走四個索引
(1):按順序寫
explain select * from t where c1 = '1' and c2 = '1' and c3 = '1' and c4 = '1';
(2):不按順序寫燃少,經過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';
因為組合索引遵循最左前綴原則,而阵具,我們的組合索引第一個字段是c1碍遍,如果我們的where查詢條件中沒有c1這個篩選條件,那么mysql默認認為我們不希望通過索引查詢阳液。
(2):覆蓋部分索引
我們可以對比上邊兩次查詢的結果怕敬,
explain select * from t where c1 = '1' and c4 = '1';
只走了C1索引,因為組合索引遵循最左前綴原則帘皿。
explain select * from t where c1 = '1' and c2 = '1';
這條查詢語句走了C1和C2兩個索引东跪,同樣,這個也是最左前綴原則的結果鹰溜。
通過上邊的對比虽填,我們在使用聯合索引的時候需要注意索引的使用順序問題。
3:當查詢條件中有范圍查詢及模糊查詢的情況
(1):第一個字段使用模糊查詢
explain select * from t where c1 like '3';
(2):第一個字段使用模糊查詢并且其后邊還有查詢條件的時候
explain select * from t where c1 like '3' and c2 = '1' and c3 = '1' and c4 = '1';
從上邊的查詢結果我們可以看出曹动,第一個字段使用模糊查詢對之后的查詢條件使用索引是沒有影響的斋日。
(3):使用between關鍵字范圍查詢
explain select * from t where c1 between '1' and '3' and c2 = '1' and c3 = '1' and c4 = '1';
全索引匹配。
(4):使用“>”“<”進行范圍查詢
explain select * from t where c1 > '3' and c2 = '1' and c3 = '1' and c4 = '1';
使用 > < 的時候仁期,會對索引產生影響桑驱,通過上邊的查詢結果我們可以發(fā)現當第一個字段使用范圍查詢之后,后邊的條件便不會再走索引了跛蛋。
explain select * from t where c1 = '1' and c2 > '1' and c3 = '1' and c4 = '1';
這次就是走兩個索引C1和C2熬的。
以上大概就是聯合索引的基本使用。
有好的建議赊级,請在下方輸入你的評論押框。
歡迎訪問個人博客
https://guanchao.site