内外连接是啥不必多说,但在做关联查询的时候,二者是有一些区别的:
举例来说,首先是外连接(左外连接为例),当两个表都没有索引,就都是全表扫描
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card;
对被驱动表(book)加上索引,就可以避免其被全表扫描了,可以看出rows从上面的20变成1了
ALTER TABLE book ADD INDEX Y ( card); #【被驱动表】,可以避免全表扫描
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card;
然后再在驱动表(type)加索引,发现没用
ALTER TABLE `type` ADD INDEX X (card); #【驱动表】,无法避免全表扫描
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card;
这说明驱动表的索引可能用不到
然后是内连接
drop index X on type;
drop index Y on book;
EXPLAIN SELECT SQL_NO_CACHE * FROM type INNER JOIN book ON type.card=book.card;
然后加索引在book,ok结果稀疏平常
ALTER TABLE book ADD INDEX Y (card);
EXPLAIN SELECT SQL_NO_CACHE * FROM type INNER JOIN book ON type.card=book.card;
但是接下来我们再加索引在type,按常理来说你可能觉得type在左,是驱动表,但实际上不一定,优化器会决定让谁当驱动表,可能会发生下面的情况:
ALTER TABLE type ADD INDEX X (card);
EXPLAIN SELECT SQL_NO_CACHE * FROM type INNER JOIN book ON type.card=book.card;
```![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ce99e0cfe4fd4aaf9de3b912419bb7e1.png)
**所以我们说内连接小表驱动大表,因为内连接的驱动表不一定是左是右**,这样会快