mysql 关联查询:直接使用 join 还是分步查询?
当涉及到关联查询时,mysql 提供了两种主要方法:直接使用 join 或分步查询。
直接使用 join
这种方法通常更有效,因为它只需执行一次查询。join 操作会自动连接满足连接条件的记录。它特别适用于需要返回来自多个表的多个列的情况。
分步查询
这种方法涉及两次或更多次查询。首先,选择要连接的表的列。然后,在后续查询中使用这些列作为 where 子句中的条件。分步查询通常用于需要对数据执行更复杂操作的情况。
效率
直接使用 join 通常更有效,因为它避免了多次查询开销。然而,当需要对数据执行复杂操作时,分步查询可以提供更大的灵活性。
执行顺序
对于使用 join 的查询,mysql 通常遵循以下执行顺序:
- 评估 where 子句(如果有的话)。
- 执行连接操作。
- 从连接结果中选择所需的列。
空表执行计划
在空表上运行执行计划显示:
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | extra | | --- | ----------- | ----- | ---------- | ---- | ------------- | --- | ------- | --- | ---- | -------- | ----- | | 1 | SIMPLE | auth_user | NULL | ALL | NULL | NULL | NULL | NULL | 0 | 100.00 | Using where | | 1 | SIMPLE | friendships_friendship | NULL | ref | PRIMARY,friendships_friendship_to_user_id_986baf39_fk_auth_user_id | friendships_friendship_to_user_id_986baf39_fk_auth_user_id | 5 | const | 0 | 100.00 | Using where; JoinUsingDistinctGroups |
登录后复制
该计划显示:
- 首先,它执行 auth_user 表上的 where 子句(to_user_id = 1)。
- 然后,它使用 friendships_friendship_to_user_id_fk 键在 friendships_friendship 表上执行连接。