sql优化,内外连接有什么区别

发布时间:2023年12月28日

内外连接是啥不必多说,但在做关联查询的时候,二者是有一些区别的:
举例来说,首先是外连接(左外连接为例),当两个表都没有索引,就都是全表扫描

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)
**所以我们说内连接小表驱动大表,因为内连接的驱动表不一定是左是右**,这样会快
文章来源:https://blog.csdn.net/pige666/article/details/135249075
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。