表結(jié)構(gòu)
CREATE TABLE `test` (
`i1` int(11) NOT NULL DEFAULT '0',
`i2` int(11) NOT NULL DEFAULT '0',
`d` date DEFAULT NULL,
`f` int(11) DEFAULT '0',
PRIMARY KEY (`i1`,`i2`),
KEY `IX_TEST_N1` (`d`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO TEST VALUES
(1, 1, '1998-01-01',1), (1, 2, '1999-01-01',2),
(1, 3, '2000-01-01',1), (1, 4, '2001-01-01',2),
(1, 5, '2002-01-01',1), (2, 1, '1998-01-01',2),
(2, 2, '1999-01-01',1), (2, 3, '2000-01-01',2),
(2, 4, '2001-01-01',1), (2, 5, '2002-01-01',2),
(3, 1, '1998-01-01',1), (3, 2, '1999-01-01',2),
(3, 3, '2000-01-01',1), (3, 4, '2001-01-01',2),
(3, 5, '2002-01-01',1), (4, 1, '1998-01-01',2),
(4, 2, '1999-01-01',1), (4, 3, '2000-01-01',2),
(4, 4, '2001-01-01',1), (4, 5, '2002-01-01',2),
(5, 1, '1998-01-01',1), (5, 2, '1999-01-01',2),
(5, 3, '2000-01-01',1), (5, 4, '2001-01-01',2),
(5, 5, '2002-01-01',1);
- Using where: 表示MySQL服務(wù)器在存儲(chǔ)引擎收到記錄后進(jìn)行“后過(guò)濾”(Post-filter),如果查詢(xún)未能使用索引窘俺,Using where的作用只是提醒我們MySQL將用where子句來(lái)過(guò)濾結(jié)果集憋飞。這個(gè)一般發(fā)生在MySQL服務(wù)器,而不是存儲(chǔ)引擎層抹竹。一般發(fā)生在不能走索引掃描的情況下或者走索引掃描窃蹋,但是有些查詢(xún)條件不在索引當(dāng)中的情況下稍算。
- Using index:表示直接訪(fǎng)問(wèn)索引就能夠獲取到所需要的數(shù)據(jù)(覆蓋索引),不需要通過(guò)索引回表身冀;
- Using index condition :
在MySQL 5.6版本后加入的新特性(Index Condition Pushdown);會(huì)先條件過(guò)濾索引,過(guò)濾完索引后找到所有符合索引條件的數(shù)據(jù)行括享,隨后用 WHERE 子句中的其他條件去過(guò)濾這些數(shù)據(jù)行搂根;
個(gè)人推論
覆蓋索引cover不了列內(nèi)容并且
where 條件包含多個(gè)索引信息并且optimizer_switch='index_condition_pushdown=on
就會(huì)走Using index condition,engine會(huì)根據(jù)多個(gè)索引篩選數(shù)據(jù)铃辖。同樣的條件如果optimizer_switch='index_condition_pushdown=off'; 就會(huì)走Using where
下圖看起來(lái)我的推論是正確的剩愧,第一張圖覆蓋索引能cover 查詢(xún)列內(nèi)容,所以沒(méi)有走icp
下圖又一次證明我的推論是正確的娇斩,當(dāng)optimizer_switch='index_condition_pushdown=off時(shí)和上圖一樣的語(yǔ)句走了Using where
但是看起來(lái)下圖和我上邊的結(jié)論相悖仁卷,為啥=查詢(xún)就變成using where 而不是Using index condition,因?yàn)橄聢D選中的key是PRIMARY(l1,l2),mysql優(yōu)化器認(rèn)為按照主鍵索引在engine篩選記錄犬第,然后把記錄給到server讓server根據(jù)d去過(guò)濾锦积,性能更好,所以沒(méi)有選擇icp歉嗓。
補(bǔ)充:而且并非全部WHERE條件都可以用ICP篩選充包,如果WHERE條件的字段不在索引列中,還是要讀取整表的記錄到Server端做WHERE過(guò)濾遥椿。
下面是博客Index Condition Pushdown中的兩幅插圖基矮,形象的描述了使用ICP和不使用ICP,優(yōu)化器的數(shù)據(jù)訪(fǎng)問(wèn)和提取的過(guò)程冠场。