mysql联合索引以及null判断
目标:使用了联合索引,同时进行其他字段的null判断的执行计划是什么样子?
准备:mysql 5.7.18
步骤1:
建表
create table `foo_records` ( `id` bigint(20) unsigned not null AUTO_INCREMENT COMMENT 'pk', `instan` char(36) character set utf8 COLLATE utf8_general_ci not null COMMENT '约束1', `start_time` timestamp not NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间', `satis` tinyint(4) null DEFAULT NULL COMMENT '满意度', `details` varchar(8192) character set utf8 COLLATE utf8_general_ci NULL DEFAULT null COMMENT '回写具体详情', PRIMARY KEY (`id`), INDEX `idx_instance` (`instan`) using btree, INDEX `idx_ins_stime` (`instan`, `start_time`) using btree ) engine = InnoDB DEFAULT character set = utf8 COLLATE = utf8_general_ci COMMENT='测试' AUTO_INCREMENT=1 row_format=compact ;
步骤2:
插入数据
insert INTO `foo_records` ( `instan`, `satis`, `details` ) VALUES ( 'instan1', 3, '{"satis":"不满意"}' ),( 'instan1', null, null );
注意:稍后再插入一次数据(start_time 要有区分)
insert INTO `foo_records` ( `instan`, `satis`, `details` ) VALUES ( 'instan1', 1, '{"satis":"满意"}' ),( 'instan1', null, null ); insert INTO `foo_records` ( `instan`, `satis`, `details` ) VALUES ( 'instan2', 1, '{"satis":"满意"}' ),( 'instan2', null, null );
步骤3:
查看各种情况下的执行计划
3-1:走单一索引
插入新数据前

插入新数据后
(注意索引不是必定会走的!)
参考:https://blog.csdn.net/CSDNcircular/article/details/107253747

3-2:走联合索引
插入新数据前

插入新数据后

重点 3-3:联合索引及 null 判断


https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html
重点3-4:联合索引及 not null 判断


3-5:未走联合索引


3-6:改变筛选条件的顺序



浙公网安备 33010602011771号