mysql sql执行计划

先记录几个sql 的执行计划,不是很了解 为什么这几个 sql 生成这种执行计划

表结构:

CREATE TABLE `cash` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `employee_id` int(11) NOT NULL,
  `currency_id` int(11) NOT NULL,
  `effective_date` date NOT NULL,
  `items` text NOT NULL,
  `status` smallint(6) NOT NULL DEFAULT '1',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_employee_id` (`employee_id`),
) ENGINE=InnoDB AUTO_INCREMENT=22236035 DEFAULT CHARSET=utf8mb4;

SQL1: 没有对列有条件过滤,但是 使用了这列的索引

explain select id,employee_id from cash where id in (1, ... 5999);  #6 千个 连续的id 值

结果:
在这里插入图片描述
猜测是 因为表 cash 中 id 很稀疏 ? 实际上 这个表中id 命中的记录一条都没有;

SQL2: in 过大,导致 不使用索引

explain select id,employee_id from cash where status=1 and id in (1, ... 5999);  #6 千个 连续的id 值

SQL2 和SQL1 类型,但是where 条件中多了一列 status,则执行计划就变了:
在这里插入图片描述

SQL 3: in 过大,导致 不使用索引

sql 3 和sql 1 类型,但是 将employee_id 列(有索引)修改成一个普通的列 currency_id ,结果 就没有索引了


在这里插入图片描述

SQL 4: 正常的case

sql 4 是大家所了解的场景,id 为主键列,对 in 条件使用了索引

explain select id,currency_id from cash where   id in (1 ,2,3); 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值