Mysql的Join操作为何要小表驱动大表?
MySQL在执行Join操作时,优先使用较小的表作为驱动表(也称为外层表)去连接较大的表(也称为被驱动表或内层表)。这样做的原因是,对于连接操作,通常需要对驱动表进行全表扫描或根据索引进行查找,然后根据连接条件与被驱动表进行匹配。
没有索引的情况下如下图所示
Excalidraw Loading...
有用到索引的情况如下图所示
Excalidraw Loading...
因此,小表驱动大表速度快的前提是:两个表上根据主/外键建立了索引,这样在根据某一条数据查找B+树时,速度就会大大提高,若没有建立索引,则两个表无论谁当作主表,查找数据的次数都是一样的。
如果先对小表进行操作,那么总的扫描行数和匹配次数会相对较少,从而提高查询的效率。 例如,假设有表 A(小表)和表 B(大表)进行连接,如果以表 A 作为驱动表,那么遍历表 A 的成本相对较低,然后根据连接条件与表 B 进行匹配,效率会更高。