多表查询优化
驱动表理论
外连接
左外连接:一般来说:坐表为驱动表,右表为被驱动表
内连接
对于内连接来讲,如果表的连接条件中只能有一个字段有索引,则有索引的字段所在表会被作为被驱动表出现
对于内连接来讲,在两个表的连接条件都存在索引的情况下,会选择小表作为驱动表。以小表驱动大表
不太理解哪种情况应该使用EXISTS,哪种情况应该使用IN。选择的标准是看能否使用表的索引吗?
索引是个前提,其实选择与否还是要看表的大小。你可以将选择的标准理解为小表驱动大表。在这种方式下的效率是最高的。
比如下面这样:
1 | select * from A where cc IN (select cc from B) |
当A小于B时,用EXISTS。因为EXISTS的实现,相当于外表循环,实现的逻辑类似于:
1 | for i in A |
当B小于A时用IN,因为实现的逻辑类似于:
1 | for i in B |
哪个表小就用哪个表来驱动,A表小就用EXISTS,B表小就用IN。
in是把外表和内表作hash连接
而exists是对外表作loop循环,每次loop循环再对内表进行查询,关联子查询
如果查询的两张表大小相当,那么用in和exists差别不大;
如果两个表中一个较小一个较大,则子查询表大(内表大)的用exists;
如果两个表中一个较小一个较大,自查询表小(内表小)的用in。
1 | [mysql] |