Appearance
JOIN 优化
1、如何区分驱动表和被驱动表?
使用 explain 判断,id 相同时先执行的就是驱动表。驱动表决定数据量,被驱动表决定查询效率。一般情况下,先执行的是驱动表,在 JOIN 执行的过程中,驱动表的每一行都会去匹配被驱动表,被驱动表会为驱动表的每一行进行查询匹配。
2、如何优化驱动表和被驱动表?
- 驱动表通常是全表扫描或范围扫描,而且每行都会去匹配被驱动表,决定查询的循环次数,因此优化的方式是想办法减少驱动表的数据量(小表),或者使用过滤条件多的表作为驱动表
- 被驱动表会为驱动表的每一行进行匹配查找,因此优化的方式是使用有索引的表作为被驱动表,或者在被驱动表上创建索引,来提高查找效率
优化原则:
- 小表驱动大表(减少循环次数)
- 有索引的表作为被驱动表(提高查找效率)
- 过滤条件多的表作为驱动表(先过滤减少数据量)
3、驱动表和被驱动表都有可能是 eq_ref 吗?
- 驱动表:通常不会是 eq_ref,因为驱动表通常是全表扫描、范围扫描或索引扫描
- 被驱动表:当使用唯一索引进行等值连接时,就是 eq_ref。在典型的 JOIN 查询中,只有被驱动表会显示为 eq_ref,表示它通过唯一索引进行精确匹配