1.引入

    我们呢,在上一节课的时候优化了一张单一的数据库表。那么接下来呢。我们一起优化一下俩张数据库表的索引。

2.创建操作的数据库

    创建用户表:admin,并添加数据

-- ----------------------------
-- Table structure for admin
-- ----------------------------
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `adminname` varchar(255) NOT NULL,
  `realname` varchar(255) DEFAULT NULL,
  `adminpassword` varchar(255) NOT NULL,
  `adminEmail` varchar(255) DEFAULT NULL,
  `adminNote` varchar(255) DEFAULT NULL,
  `role_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_adname_relname` (`adminname`,`realname`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of admin
-- ----------------------------
INSERT INTO `admin` VALUES ('1', 'superadmin', '张三', '123', '1115322415@qq.com', '测试数据', '1');
INSERT INTO `admin` VALUES ('2', 'usertest', '李四', '456', '2312361783@qq.com', '测试数据', '2');

    创建权限表:roles,并添加数据

-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
  `role_id` int(10) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(25) NOT NULL,
  `roles1` varchar(25) DEFAULT NULL,
  `roles2` varchar(25) DEFAULT NULL,
  `roles3` varchar(25) DEFAULT NULL,
  `roles4` varchar(25) DEFAULT NULL,
  `roles5` varchar(25) DEFAULT NULL,
  `roles6` varchar(25) DEFAULT NULL,
  `roles7` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of roles
-- ----------------------------
INSERT INTO `roles` VALUES ('1', '超级管理员', '1', '1', '1', '1', '1', '1', '1');
INSERT INTO `roles` VALUES ('2', '一般管理员', '1', '1', '1', '1', '1', '', '1');
INSERT INTO `roles` VALUES ('3', 'VIP用户', '1', '1', '1', '1', null, null, null);
INSERT INTO `roles` VALUES ('4', '普通用户', '1', '1', null, null, null, null, null);
INSERT INTO `roles` VALUES ('5', '适用用户', '1', null, null, null, null, null, null);

数据表创建以及内容添加结果:

es索引mysql俩张表 两个表建立索引_MySQL

3.查询优化

  (1).优化查询SQL: select * from admin left join roles on admin.role_id = roles.role_id;

es索引mysql俩张表 两个表建立索引_es索引mysql俩张表_02

  问题:我们查询操作额结果type有ALL。我们尝试着添加索引进行优化的操作,但是问题来了,我们添加的索引是添加在                           admin.role_id上还是添加在roles_role_id上?。现在无法确定应该建在哪一些上,那么我们只能够一个一个试着建,然后看               谁的效果好。

  ①:我们给roles的role_id创建索引。

es索引mysql俩张表 两个表建立索引_MySQL_03

  ②:再次进行查询操作

es索引mysql俩张表 两个表建立索引_数据库_04

        我们发现我们的操作使得查询的roles表的type由ALL改变成了ref。但是呢admin表的type还是ALL。

   ③:我们把刚才建立的索引删掉,然后再次在admin表的role_id上建立

es索引mysql俩张表 两个表建立索引_索引_05

   ④:我们呢再次进行查询操作  

es索引mysql俩张表 两个表建立索引_es索引mysql俩张表_06

       综上俩个效果的比较,我们发现第一种情况下的优化效果比第二种的好。由于我们查询的是左连接,那么就是说left join条件用于确定如何从右表搜索行,左边一定都有。所以右边是我们的关键点,那么一定需要建立索引。也就是"左连接加右表"。

     ⑤:我们返回到给右表(roles)加索引的内容

es索引mysql俩张表 两个表建立索引_es索引mysql俩张表_07

     (2).优化查询SQL:select * from admin right join roles on admin.role_id = roles.role_id;

     ①:我们进行查询操作:

es索引mysql俩张表 两个表建立索引_索引优化_08

    ②:那么,我们发现是右连接进行查询操作,那么我们需要在坐标上建立索引,即在admin上建立索引(或者是说把查询的sql中的表位置进行一个对调)。我们先把roles上的索引删除,然后再在admin表上添加索引。然后再进行相应的查询。

es索引mysql俩张表 两个表建立索引_索引_09

es索引mysql俩张表 两个表建立索引_es索引mysql俩张表_10

   

综合:连接操作的建索引规则:左连接建索引在右表,右连接建立索引在左表。