联查
MySql联查根据被驱动表在关联字段上是否索引分为两种:Index Nested-Loop Join 以及 Block Nested-LoopJoin。假设T1符合条件记录行数为N,T2记录行数为M,以驱动表T1 与被驱动表T2分别描述两种逻辑:
如果被驱动表在关联字段上有索引,那么就选择Index Nested-Loop Join
1)从T1读取一行符合条件的记录行
2)通过关联字段从T2的索引检索符合条件的记录行
3)将T2 与T1的记录行拼接,作为结果集的一部分
4)重复 1到3步骤,直到T1无符合条件记录为止
那么该联查的复杂度:N + N*2*log2M(此处的2是考虑了回表)。因而,使用小表作为驱动表性能最好。此外在程序中嵌套查询,那么从检索行数上来说没有差别。但是,客户端与服务端要多很多次交互,因此在MySQL中执行联查的要比在程序中嵌套查询要好很多。
如果被驱动表在被关联字段上没有索引,那么就选择Block Nested-Loop Join
1)将T1表中符合条件的记录行放入到Join_Buffer中
2)将T2的记录行都读取一遍,然后再与J