表連接的字段都需要建索引麼?
現有tab1和tab2 使用sss字段關聯查詢,sss沒有建立索引時查詢全表掃描,在其中一個表種加了一個sss字段的索引另外的表沒有加sss後就走索引了,這裏是需要都創建索引麼??有點迷惑了,還請大師指點迷津
CREATE TABLE `tab1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key1` varchar(255) DEFAULT NULL,
`key2` varchar(11) DEFAULT NULL,
`key3` varchar(255) DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
`sss` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_key1` (`key1`,`key2`,`key3`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `tab2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
`sss` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name_sex` (`name`,`sex`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `tab1` VALUES (1, '11', '1', '123', '123', NULL);
INSERT INTO `tab1` VALUES (2, '22', '2', '234', '2', NULL);
INSERT INTO `tab1` VALUES (3, '33', '3', '345', '3', NULL);
INSERT INTO `tab2` VALUES (1, '11', '1', '123', '1');
INSERT INTO `tab2` VALUES (2, '22', '2', '234', '2');
INSERT INTO `tab2` VALUES (3, '33', '3', '345', '3');
執行查詢
EXPLAIN
select * from tab1 left join tab2 on tab1.sss = tab2.sss
where tab2.name='11';
#其中一個表種添加sss的索引
ALTER TABLE `ansh_test`.`tab1`
ADD INDEX `idx_sss`(`sss`) USING BTREE;
#其中一個表種添加sss的索引
ALTER TABLE `ansh_test`.`tab1`
ADD INDEX `idx_sss`(`sss`) USING BTREE;
EXPLAIN
select * from tab1 left join tab2 on tab1.sss = tab2.sss
where tab2.name='11';