創建測試表,添加測試數據
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`manager_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idex_name_age_managerid` (`name`,`age`,`manager_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('205', null, '24', '102');
INSERT INTO `users` VALUES ('206', null, '25', '102');
INSERT INTO `users` VALUES ('101', 'jack', '35', null);
INSERT INTO `users` VALUES ('102', 'tom', '30', '101');
INSERT INTO `users` VALUES ('201', 'xiaoli', '23', '102');
INSERT INTO `users` VALUES ('203', 'xiaoliu', '22', '102');
根據組合索引 idex_name_age_managerid (`name`,`age`,`manager_id`) 測試不同場景下的sql執行計劃
1)EXPLAIN SELECT * FROM `users` WHERE name = 'tom' and age = 30 and manager_id = 101;
2)EXPLAIN SELECT * FROM `users` WHERE name = 'tom';
3)EXPLAIN SELECT * FROM `users` WHERE age = 30;
4)EXPLAIN SELECT * FROM `users` WHERE manager_id = 101;
5)EXPLAIN SELECT * FROM `users` WHERE name = 'tom' and age = 30;
6)EXPLAIN SELECT * FROM `users` WHERE name = 'tom' and manager_id = 101;
7)EXPLAIN SELECT * FROM `users` WHERE age = 30 and manager_id = 101;
結論總結:
由以上執行計劃可以看出,第3、4、7個執行計劃沒有命中索引,所以,只要是以where name開頭的sql語句都命中了索引(遵循左前綴原則);
根據執行計劃分析,命中索引的sql第6個查詢效率是比較低的,所以:
組合索引 idex_name_age_managerid (`name`,`age`,`manager_id`) sql 執行爲了提高執行效率,where 條件字段順序應該遵循以下組合
name
name,age
name,age,manager_id