MySQL高级知识(五)——索引分析

前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析。html


0.准备

首先建立三张表:tb_emp(职工表)、tb_dept(部门表)和tb_desc(描述表)缓存

1)tb_emp表。学习

DROP TABLE IF EXISTS `tb_emp`;
CREATE TABLE `tb_emp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
`deptid` int(11) NOT NULL,
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ---------------------------- INSERT INTO `tb_emp`(username,deptid) VALUES ('Tom', '1'); INSERT INTO `tb_emp`(username,deptid) VALUES ('Jack', '1'); INSERT INTO `tb_emp`(username,deptid) VALUES ('Mary', '2'); INSERT INTO `tb_emp`(username,deptid) VALUES ('Rose', '3');

2)tb_dept表。测试

DROP TABLE IF EXISTS `tb_dept`;
CREATE TABLE `tb_dept` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
INSERT INTO `tb_dept`(name) VALUES ('综合部');
INSERT INTO `tb_dept`(name) VALUES ('研发');
INSERT INTO `tb_dept`(name) VALUES ('测试');
INSERT INTO `tb_dept`(name) VALUES ('总裁');

3)tb_desc表。优化

DROP TABLE IF EXISTS `tb_desc`;
CREATE TABLE `tb_desc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `empid` int(11) DEFAULT NULL,
  `deptid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
INSERT INTO `tb_desc`(empid,deptid) VALUES (1, 1);
INSERT INTO `tb_desc`(empid,deptid) VALUES (2, 1);
INSERT INTO `tb_desc`(empid,deptid) VALUES (3, 2);
INSERT INTO `tb_desc`(empid,deptid) VALUES (4, 3);

注:这里强行将员工表与部门表不直接关联,经过第三张表(描述表)进行关联,主要为了进行join的分析。spa

1.left join

#1.首先执行查询。code

#2.经过explain进行分析。htm

分析:从explain执行结果能够看出对两表都是用了全表扫描(ALL),而且在tb_desc表中还使用了join链接缓存,须要进行优化。可是如何优化?是在左表创建索引仍是右表创建索引呢?由于左链接左表是全有,因此应该在右表创建索引。blog

#3.右表建立索引。索引

经过explain执行能够看到,在建立索引后,得到了比较不错的结果。(type=ref,Extra=Using index)。

结论:left join(左链接)状况下,应该在右表(tb_desc)建立索引。

2.right join

经过上面left join的例子,咱们直接交换两表位置,并将left join改变成right join。

分析:

与left join进行对比,能够获得以下结论:

#1.在left join下,首先执行tb_emp(左表),type=ALL,由于左链接状况下左表全有,所以咱们在tb_desc(右表)建立索引,获得比较理想的效果。

#2.在right join下(咱们交换了tb_emp和tb_desc的位置),执行顺序:tb_emp(右表)→ tb_desc(左表)。右表type=ALL,由于右链接状况下右表全有,所以在左表(tb_desc,咱们交换了位置)建立索引,效果确定和left join同样。

总结

left join(左链接):右表建立索引。

right join(右链接):左表建立索引。

简记:左右外链接,索引相反建(left:右表建,right:左表建)。


by Shawn Chen,2018.6.23日,晚。


相关内容

MySQL高级知识系列目录

相关文章
相关标签/搜索