mysql,explain執行計劃組合索引測試

創建測試表,添加測試數據

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章