1. 程式人生 > >MySQL之索引:索引欄位使用順序對複合索引有效性的影響

MySQL之索引:索引欄位使用順序對複合索引有效性的影響

整理下複合索引中,使用順序對索引有效性的影響

首先這裡建立一張資料表,並建立符合索引( index_A,index_B,index_C

CREATE TABLE `test_index_sequence` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `index_A` varchar(255) DEFAULT NULL,
  `index_B` varchar(255) DEFAULT NULL,
  `index_C` varchar(255) DEFAULT NULL,
  `field_D` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  KEY `complex_index` (`index_A`,`index_B`,`index_C`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

並插入若干數值:


資料插入完成後,下面開始逐步驗證索引的有效性。

1、單獨使用欄位index_A

EXPLAIN
SELECT *
FROM test_index_sequence
WHERE index_A='a' 


通過EXPLAIN分析可以看到訪問型別為ref,掃描行數為3行,索引有效;


2、單獨使用欄位index_B

EXPLAIN
SELECT *
FROM test_index_sequence
WHERE index_B='b'


通過EXPLAIN分析可以看到訪問型別為ALL即全表掃描,掃描行數為9行即全部行數,索引失效;

3、單獨使用欄位index_C

EXPLAIN
SELECT *
FROM 
test_index_sequence
WHERE index_C='c'


檢視分析結果同單獨使用使用欄位 index_B,索引失效;

4、聯合使用欄位index_A,index_B
EXPLAIN
SELECT *
FROM test_index_sequence
WHERE index_A='a' AND index_B='b' 

檢視分析結果,索引有效;
5、聯合使用欄位index_A,index_C
EXPLAIN
SELECT *
FROM test_index_sequence
WHERE index_A='a' AND index_C='c' 

檢視分析結果,索引有效;

6、聯合使用欄位index_B,index_C

EXPLAIN
SELECT *
FROM test_index_sequence
WHERE index_B='b' AND index_C='c' 

檢視分析結果,索引失效;

7、聯合使用欄位index_A,index_B,index_C

EXPLAIN
SELECT *
FROM test_index_sequence
WHERE index_A='a' AND index_B='b' AND index_C='c'


檢視分析結果,索引有效;

綜述:MySQL的複合索引遵循了最左字首原則,當建立索引(index_A,index_B,index_C)時:

使用索引有效的欄位為:'index_A’,'index_A,index_C'index_A,index_B'index_A,index_B,index_C

使用索引失效的欄位為:'index_B'index_C'index_C,index_B