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:改变筛选条件的顺序

 

 

posted @ 2020-12-20 22:05  陆成  阅读(594)  评论(0)    收藏  举报