尚硅谷Mysql高级day6(p31-33)

今天是2021-1-2。

一。两表sql优化

两表连接查询时,建索引一定要建在从表上。因为外连接条件用于确定如何从"从表"中搜索行,而主表则是返回所有记录–即全表扫描,比如左连接,那么就要给右表的连接条件字段建索引,右连接则给左表的连接条件字段建索引。

二。join查询的原理

连接查询时,主表即是驱动表 A,从表为被驱动表 B:

1.简单嵌套循环连接

简单来说,就是每读取一行A表的数据,就要全表扫描B与之匹配

2.索引嵌套循环连接

当我们为被驱动表的连接条件字段建立了索引时,每读取一行A表的数据,通过为B表字段建立的索引,直接找到匹配行读取数据

3.缓存块嵌套循环连接

当被驱动表的连接条件字段没有建立索引时,mysql其实是默认使用该算法,而不是第一种。该算法简单来说就是,mysql创建了一个join buffer的缓冲区(我们使用explain查看sql执行情况时有时会看到using join buffer), 当被驱动表的连接条件字段没有建立索引时,mysql每次读取被驱动表数据之前会将驱动表的多条数据一次性存入缓冲区中,然后再全表扫描被驱动表。
可以看到,第一种是驱动表读取一行,被驱动表全表扫描一次。而这种是驱动表读取多行,被驱动表扫描一次,缓冲区的大小可以通过修改配置文件来增大。

三。join查询的优化总结

1.连接查询时,用数据量小的作为驱动表,因为驱动表读取一轮,被驱动表全表扫描一次,而我们肯定是希望减少全表扫描次数的。也即我们常说的,小表驱动大表。
2.连接查询时,为被驱动表的连接字段建立索引,mysql就可以使用索引嵌套循环连接,驱动表读取一行,被驱动表使用索引,也只需要读取一行
3.增大缓冲区的大小,这使得mysql在使用缓存块嵌套循环连接时,可以一次性存放更多的驱动表数据到缓冲区,进一步减少被驱动表的全表扫描次数
4.减少不必要的字段查询,这也可以使缓冲区可以存放存放更多的驱动表数据。
5.对比来看,索引嵌套循环连接是减少了被驱动表扫描的数据量,而缓存块嵌套循环连接是减少了被驱动表扫描的次数。不过肯定还是推荐索引嵌套循环连接的,毕竟即使使用缓冲区减少了被驱动表的扫描次数,当数据量过大,还是会影响查询速度,所以连接查询时请务必给被驱动表的连接字段建立索引。

猜你喜欢

转载自blog.csdn.net/qq_44727091/article/details/112124375