版本:5.5.18.1
联合索引建立情况:
查询条件顺序和联合索引一样
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID = "" AND isFinish ="" AND missionType ="" AND creTm = "";
查询条件顺序和联合索引顺序完全相反
EXPLAIN SELECT * FROM t_cmp_mission WHERE creTm = "" AND missionType ="" AND isFinish ="" AND companyID = "" ;
查询条件中不包含索引的第一个
EXPLAIN SELECT * FROM t_cmp_mission WHERE isFinish ="4" and missionType ="4" AND creTm ="";
查询条件只有联合索引的第一个索引
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID = "44";
只有联合索引的非第一个索引
EXPLAIN SELECT * FROM t_cmp_mission WHERE isFinish = "44";
非第一个索引列like
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID = "44" AND isFinish ="4" and missionType ="4" and creTm LIKE '%000%';
第一个索引列like 且双边模糊匹配
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID LIKE '%000%' AND isFinish ="4" and missionType ="4" and creTm ="";
非第一个索引列like 且双边模糊匹配
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID ="" AND isFinish LIKE '%aa%' AND missionType ="4" and creTm ="";
第一个索引列like 且右边模糊匹配
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID LIKE '000%' AND isFinish ="4" and missionType ="4" and creTm ="";
第一个索引列like 且左边模糊匹配
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID LIKE '%000' AND isFinish ="4" and missionType ="4" and creTm ="";
查询条件中包含 or
EXPLAIN SELECT * FROM t_cmp_mission WHERE companyID ="someID" OR isFinish ="4" and missionType ="4" and creTm ="";
联合索引遇上 where 1=1
EXPLAIN SELECT * FROM t_cmp_mission WHERE 1=1 AND companyID ="someID" AND isFinish ="4" and missionType ="4" and creTm ="";
总结
- 联合索引所有成员均以and 出现时与顺序无关,都能生效
- 条件语句中出现or 则联合索引无效
- 条件语句中缺少排在第一位的索引字段,整个联合索引失效
- 欲使联合索引要生效,排在第一位的索引为必须出现,位置不限
- 使用like 不一定会导致索引失效,只有like 使用在第一位的索引为且左边做了模糊匹配才会使索引失效
- 或许是因为mysql内部做了优化,where 1=1并不影响索引的使用,不会扫描全表