表 t_1 有一个复合索引 idx_user_id_create_time(user_id,create_time)
执行以下SQL
SELECT COUNT(1) FROM t WHERE create_time >= '2024-01-10' AND create_time <= '2024-05-25' ;
看似不满足复合索引最左前缀的条件,但依然会使用复合索引 idx_user_id_create_time(user_id,create_time), 满足覆盖索引.
但如果是执行以下SQL,确实无法使用复合索引.
SELECT * FROM t WHERE create_time >= '2024-01-10' AND create_time <= '2024-05-25' ;
字段上有索引也未必使用索引
假设表 t 的 pay_create 字段上有索引 idx_pay_create(pay_create), 查询 SELECT … FROM t WEHRE pay_create >= ‘2024-01-10’ AND pay_create <= ‘2024-05-20’ 会使用索引 idx_pay_create , 但是当扩大时间范围 SELECT … FROM t WEHRE pay_create >= ‘2023-03-10’ AND pay_create <= ‘2024-05-20’ 可能未必会使用索引 idx_pay_create 了, 可能会全表扫描 .
字段上无索引也未必不用索引
本文章介绍的案例 SELECT COUNT(1) FROM t WHERE create_time >= ‘2024-01-10’ AND create_time <= ‘2024-05-25’ 在字段 create_time 上没有单独的索引, 只有组合索引 idx_user_id_create_time, 但该SQL语句依然使用了索引 idx_user_id_create_time .
个人站点
个人公众号 Netty历险记