mysql联合索引字段顺序

原始sql

SELECT COUNT(1) FROM fp_pile_order.t_pile_order WHERE f_yn = 1 AND f_start_time >= '2022-04-07 00:00:00' AND f_start_time <= '2022-04-14 23:59:59' AND f_operator_code = '00000';

他的执行计划

image.jpeg

可见,这个sql执行过程是被命中索引了的,索引如下

create index idx_order_startime_operator on t_pile_order (f_start_time, f_operator_code);

这个索引创建的稍微有点问题,在查询筛选中,如果用到了范围查询,在创建联合索引的时候,应该尽量把需要范围查询的字段放在最后

在上面创建的索引中,首先命中 f_start_time 字段索引,由于他是当前联合索引的第一个字段,那么他就不会在去走索引的第二个字段了;

他的执行过程是先通过索引查询出符合时间范围的数据,由引擎返回给服务器,然后服务器再执行where条件筛选,故在extra中出现了 using where

为了解决这个问题,创建这个索引的过程应该是本着让索引命中更多列的原则,把startTime字段放在联合索引的最后,优化后的索引如下:

ALTER TABLE `fp_pile_order`.`t_pile_order` ADD INDEX `idx_foperatorcode_fyn_fstarttime` (`f_operator_code`, `f_yn`, `f_start_time`)

你可能感兴趣的:(mysql联合索引字段顺序)