-- 添加联合索引ALTERTABLE`order_demo`addindex`idx_USER_ID_COUNT_DATE`(`USER_ID`,`COUNT_DATE`);-- 删除索引ALTERTABLE order_demo DROPINDEX`idx_USER_ID_COUNT_DATE`;-- SQL_ID:4972193622039785254SELECTCOUNT(1)FROM order_demo T
WHERE T.USER_ID =428964304AND T.COUNT_DATE >='2020-11-30'AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL1DAY);-- 添加联合索引前,表原来没有联合索引,只有单列索引COUNT_DATE,USER_IDSELECTCOUNT(1)FROM order_demo T WHERE T.USER_ID =428964304AND T.COUNT_DATE >='2020-11-30'AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL1DAY);
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1SIMPLE T nullALL index_count_date,index_user_id 5100Usingwhere
总结:没走索引全表扫描
-- 添加联合索引后,添加联合索引(`USER_ID`,`COUNT_DATE`)SELECTCOUNT(1)FROM order_demo T WHERE T.USER_ID =428964304AND T.COUNT_DATE >='2020-11-30'AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL1DAY);
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1SIMPLE T null rang index_count_date,index_user_id,idx_USER_ID_COUNT_DATE idx_USER_ID_COUNT_DATE 15NULL5100Usingwhere;Usingindex
总结:使用到了联合索引idx_USER_ID_COUNT_DATE
-- 验证联合索引顺序问题,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查询条件是`USER_ID`,`COUNT_DATE`SELECTCOUNT(1)FROM order_demo T WHERE T.USER_ID =428964304AND T.COUNT_DATE >='2020-11-30'AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL1DAY);
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1SIMPLE T null rang index_count_date,index_user_id,idx_USER_ID_COUNT_DATE idx_USER_ID_COUNT_DATE 15NULL5100Usingwhere;Usingindex
总结:条件语句与联合索引顺序一致,rang,走了该联合索引。
-- 验证联合索引顺序问题,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查询条件是`COUNT_DATE`,`USER_ID`SELECTCOUNT(1)FROM order_demo T WHERE T.COUNT_DATE >='2020-11-30'AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL1DAY)AND T.USER_ID =428964304;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1SIMPLE T null rang index_count_date,index_user_id,idx_USER_ID_COUNT_DATE idx_USER_ID_COUNT_DATE 15NULL5100Usingwhere;Usingindex
总结:条件语句与联合索引顺序颠倒,rang,走了该联合索引。与条件顺序一致的执行计划完全一样,说明mysql拿到sql语句并不是立即执行,而是优化后执行!!!
仅限于5.7.19版本测试,其他版本未测试不做评论。
-- 验证联合索引顺序问题,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查询条件是`COUNT_DATE`SELECTCOUNT(1)FROM order_demo T WHERE T.COUNT_DATE >='2020-11-30'AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL1DAY);
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1SIMPLE T null rang index_count_date idx_COUNT_DATE 6NULL5100Usingwhere;Usingindex
总结:走单列索引
-- 验证联合索引顺序问题,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查询条件是`USER_ID`SELECTCOUNT(1)FROM order_demo T WHERE T.USER_ID =428964304;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1SIMPLE T null rang index_user_id,idx_USER_ID_COUNT_DATE index_user_id 9NULL14100Usingindex
总结:走单列索引