mysql sql执行计划
Posted 安然_随心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
以上是关于mysql sql执行计划的主要内容,如果未能解决你的问题,请参考以下文章