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);
数据表创建以及内容添加结果:
3.查询优化
(1).优化查询SQL: select * from admin left join roles on admin.role_id = roles.role_id;
问题:我们查询操作额结果type有ALL。我们尝试着添加索引进行优化的操作,但是问题来了,我们添加的索引是添加在 admin.role_id上还是添加在roles_role_id上?。现在无法确定应该建在哪一些上,那么我们只能够一个一个试着建,然后看 谁的效果好。
①:我们给roles的role_id创建索引。
②:再次进行查询操作
我们发现我们的操作使得查询的roles表的type由ALL改变成了ref。但是呢admin表的type还是ALL。
③:我们把刚才建立的索引删掉,然后再次在admin表的role_id上建立
④:我们呢再次进行查询操作
综上俩个效果的比较,我们发现第一种情况下的优化效果比第二种的好。由于我们查询的是左连接,那么就是说left join条件用于确定如何从右表搜索行,左边一定都有。所以右边是我们的关键点,那么一定需要建立索引。也就是"左连接加右表"。
⑤:我们返回到给右表(roles)加索引的内容
(2).优化查询SQL:select * from admin right join roles on admin.role_id = roles.role_id;
①:我们进行查询操作:
②:那么,我们发现是右连接进行查询操作,那么我们需要在坐标上建立索引,即在admin上建立索引(或者是说把查询的sql中的表位置进行一个对调)。我们先把roles上的索引删除,然后再在admin表上添加索引。然后再进行相应的查询。
综合:连接操作的建索引规则:左连接建索引在右表,右连接建立索引在左表。