MySQL explain使用日志一

MySQL explain使用日志一

以下结果由本篇中的测试语句推测得出,可能有误差,发出来算是抛砖引玉吧

建表DDL

CREATE TABLE `barrage_info` (
  `barrage_id` int(11) NOT NULL AUTO_INCREMENT,
  `barrage_sender_id` int(11) NOT NULL,
  `content` varchar(512) NOT NULL,
  `speed` int(11) NOT NULL,
  `color` varchar(16) NOT NULL,
  `text_size` int(11) NOT NULL,
  `star_num` int(11) NOT NULL,
  `barrage_send_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `road` int(11) NOT NULL,
  PRIMARY KEY (`barrage_id`),
  KEY `idx_sender_id` (`barrage_sender_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4;


CREATE TABLE `user_info` (
  `user_id` bigint(11) NOT NULL AUTO_INCREMENT,
  `nick_name` varchar(64) NOT NULL,
  `user_sex` varchar(8) DEFAULT NULL,
  `user_phone_num` varchar(16) DEFAULT NULL,
  `user_description` varchar(255) DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_email` varchar(64) NOT NULL,
  `user_password` varchar(64) NOT NULL,
  `user_status` tinyint(3) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_info_user_email_un` (`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=220 DEFAULT CHARSET=utf8mb4;

使用分析

/**
* 根据table得知 先查u2表,需要显示只有u1表的列,u2表用到的列只有user_email,
* 且该字段设置了唯一值索引,因此u2表最终走的是index类型,即:**索引列**全表扫描
* 接着查u1表,因为上一个查出来的u2的user_email列是唯一的,所以u1这里直接一一对应查询,
* 类型就是eq_ref
* 暂时测试的情况表明,等号左边的列是唯一索引列时,若右边为变量,则使用的是eq_ref类型
*/
EXPLAIN SELECT u1.* from user_info u2 , user_info u1 where u2.user_email = u1.user_email;

1


/**
* 根据id顺序执行,先查u1,需要显示是u1的全部列,包括未加索引的列,所以这里u1直接走的ALL全表扫描
*/
EXPLAIN SELECT u1.* from user_info u1 , user_info u2 where u2.user_email = u1.user_email;

2

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页