今天我们来聊一聊Mysql中的join原理。
join用法基本工作过的都会用,不管是left join、right join、inner join语法都是比较简单的。
但是,join的原理确实博大精深,对于一些传统it企业,几乎是一句sql走天下,join了五六个表,当数据量上来的时候,就会变得非常慢,索引对于掌握join的优化还是非常有必要的。
阿里的开发手册中规定join不能查过三个,有些互联网是明确规定不能使用join的的明文规定,那么在实际的场景中,我们真的不能使用join吗?我们就来详细的聊一聊。
Mysql的join主要涉及到三种算法,分别是Simple Nested-Loop Join、Block Nested-Loop Join、Index Nested-Loop Join,下面我们就来深入的了解这三种算法的原理、区别、效率。
首先,为了测试先准备两个表作为测试表,并且使用存储过程初始化一些测试数据,初始化的表结构sql如下所示:
CREATE TABLE `testa` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '活动主键',
`col1` int(20) NOT NULL DEFAULT '0' COMMENT '测试字段1',
`col2` int(20) NOT NULL DEFAULT '0' COMMENT '测试字段2',
PRIMARY KEY (`id`),
KEY `col1` (`idx_col1`)
)ENGINE=InnoDB AUTO_INCREMENT=782 DEFAULT CHARSET=utf8mb4 COMMENT='测试表1';
CREATE TABLE `testb` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '活动主键',
`col1` int(20) NOT NULL DEFAULT '0' COMMENT '测试字段1',
`col2` int(20) NOT NULL DEFAULT '0' COMMENT '测试字段2',
PRIMARY KEY (`id`),
KEY `col1` (`idx_col1`)
) ENGINE=InnoDB AUTO_INCREMENT=782 DEFAULT CHARSET=utf8mb4 COMMENT='测试表2';