一. 前言

上一篇整理完了 MySQL 的性能优化方式 , 其中最常用的就是 explain .

这一篇来详细看看 explain 中各个参数的含义和扩展 , 整理出来便于使用时快速查询

二 . explain 使用

[](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/745f67fc78e6486c86fdbfcd0e465f8b~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp?)

三. 业务实践

在日常实践中 , 我们应该如何使用 explain 提供的查询来判断索引怎么配置呢?

以一个实际业务场景为例 : 首先场景里面的数据分布都很均衡 , 这就导致设置的索引在查询优化器的处理下 , 很难产生最好的效果.

先来看一下表结构 :

CREATE TABLE `user_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '会员ID',
  `user_no` bigint(20) NOT NULL DEFAULT '0' COMMENT '会员编号',
  `open_id` varchar(128) NOT NULL DEFAULT '' COMMENT '外部ID',
  `org_id` varchar(128) NOT NULL DEFAULT '0' COMMENT '组织ID',
  `listen_num` int(11) NOT NULL DEFAULT '0' COMMENT '记录次数',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `create_person` varchar(50) NOT NULL DEFAULT '' COMMENT '创建人',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `update_person` varchar(50) NOT NULL DEFAULT '' COMMENT '更新人',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_org_id_open_id` (`org_id`,`open_id`) USING BTREE,
  KEY `idx_create_time` (`create_time`) USING BTREE,
  KEY `idx_update_time` (`update_time`) USING BTREE
) COMMENT='会员记录表';
复制代码

基础信息

// 1. 总记录数 4200000

// 2. 不同 org_id 下的记录数
- 1234567890 : 100万
- 9876543210 : 100万
- 8888888888 : 100万
- 6666666666 : 100万
- 其他 : 20万

// 3. 时间周期
> 2022-01
> 2022-12

复制代码

3.1 以 user_id 为条件进行查找的思路

listen_num 本身没有创建索引 , 以该字段查肯定会走全表 , 优先考虑的思路就是 > user_id 为条件进行有序查询 :

explain select * from user_info where user_id > 69999887 and listen_num > 0
复制代码

[](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/48956783820f4ae8843c1a51f2ccfbff~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp?)