目录
EXPLAIN执行计划中type字段分为以下几种:
ALL
INDEX
RANGE
REF
EQ_REF
CONST,SYSTEM
NULL
自上而下,性能从最差到最好
表结构如下:
- CREATE TABLE `film` (
- `id` int(4) NOT NULL AUTO_INCREMENT,
- `title` varchar(255) DEFAULT NULL,
- `name` varchar(255) DEFAULT NULL,
- `remark` varchar(255) DEFAULT NULL,
- `rating` int(4) DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_title` (`title`) USING BTREE
- ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
- CREATE TABLE `payment` (
- `id` int(4) NOT NULL AUTO_INCREMENT,
- `customer_id` int(4) DEFAULT NULL,
- `remark` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_fk_customer_id` (`customer_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
type = ALL,全表扫描,MYSQL扫描全表来找到匹配的行
(因为film表中rating不是索引)
explain select * from film where rating > 9;

type = index,索引全扫描,MYSQL遍历整个索引来查找匹配的行。(虽然where条件中没有用到索引,但是要取出的列title是索引包含的列,所以只要全表扫描索引即可,直接使用索引树查找数据)
explain select title from film;

type = range ,索引范围扫描,常见于<、<=、>、>=、between等操作符(因为customer_id是索引,所以只要查找索引的某个范围即可,通过索引找到具体的数据)
explain select * from payment where customer_id > 300 and customer_id < 350;

type = ref ,使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。
(1)使用非唯一性索引customer_id单表查询
explain select * from payment where customer_id = 350;

表结构如下:
- CREATE TABLE `term_mac_iptv_info` (
- `BUSI_ID` varchar(50) NOT NULL COMMENT '业务编号',
- `MKT_RES_NBR` varchar(50) DEFAULT NULL COMMENT '营销资源编码',
- `TERM_CODE` varchar(50) DEFAULT NULL COMMENT '串码',
- `MAC_ID` varchar(50) DEFAULT NULL COMMENT 'MAC地址',
- `ACTION` int(1) DEFAULT NULL COMMENT '动作 1 新增 2-删除',
- `USER_ID` bigint(16) DEFAULT NULL COMMENT '用户ID',
- `CREATE_DATE` datetime DEFAULT NULL COMMENT '创建时间',
- `DEAL_COUNT` int(1) DEFAULT NULL COMMENT '处理次数',
- `RETURN_CODE` varchar(30) DEFAULT NULL COMMENT '返回码',
- `RETURN_MSG` varchar(2000) DEFAULT NULL COMMENT '返回描述',
- `SEND_PLATFORM` int(1) DEFAULT NULL COMMENT '对端平台 1.华为 2.中兴',
- `STATUS_CD` int(1) DEFAULT NULL COMMENT '处理状态 0-未处理 1-处理成功 2-处理失败 3-处理中',
- `UPDATE_DATE` datetime DEFAULT NULL COMMENT '更新时间',
- PRIMARY KEY (`BUSI_ID`),
- KEY `INDX_TERM_MAC_IPTV_INFO_TERM_CODE` (`TERM_CODE`),
- KEY `INDX_TERM_MAC_IPTV_INFO_MAC_ID` (`MAC_ID`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IPTV同步中兴华为';
- -- 没有where 取出的title不是索引字段,走全表扫描
- explain select action from term_mac_iptv_info;
-
- -- 没有where 但是要取出的title mac_id是索引列,所以还是会走索引
- explain select mac_id from term_mac_iptv_info;
-
- -- 没有where 要取出的title包含非索引列,所以不会走索引,此时全表扫描
- explain select mac_id,action from term_mac_iptv_info;