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,则执行计划就变了:
mysql sql执行计划_第1张图片

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); 

在这里插入图片描述

你可能感兴趣的:(存储,数据库)