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