首页 > 代码库 > 关于mysql的join

关于mysql的join

最近一直在困扰的mysql join的工作原理问题,公司不推荐使用多表查询,所以我探究一下join是怎么工作的

技术分享

答案是不是的!

收藏

技术分享

也就是说连表查询说order by group by的字段必须是驱动表里的。

我理解:left join左边表就是驱动表,right join右边表就是驱动表,inner join看explain 第一行为驱动表

背景:

users 表 866行数据 主键索引

user_city 35行数据 主键索引

1.explain select users.id from user_city left join users on users.id=user_city.`user_id`

驱动表user_city user_id没有索引,users.id主键索引

技术分享

2.explain select users.id from user_city left join users on users.id=user_city.`id`

驱动表user_city id是主键索引,users.id主键索引

技术分享

3.explain select users.id from user_city left join users on users.user_id=user_city.`id`

驱动表user_city id是主键索引,users.user_id没有索引

技术分享

3.explain select users.id from user_city left join users on users.user_id=user_city.`id` where user_city.id<40

驱动表user_city id是主键索引,users.user_id没有索引 where条件id索引

技术分享

4.explain select users.id from user_city left join users on users.user_id=user_city.`id` where user_city.user_id<1700

驱动表user_city id是主键索引,users.user_id没有索引 where条件user_id没有索引

技术分享

5.这两个比较很重要,当连表排序的时候,orderby字段除了必须是驱动表的字段且有索引外,过滤条件on 也必须都使用到索引才可以,是都使用!

explain select users.id from user_city left join users on users.id=user_city.`id` order by users.id desc

技术分享都使用到了索引,但是orderby的不是驱动表的字段,肯定会出现Using temporary; Using filesort

技术分享

6.explain select users.id from user_city left join users on users.id=user_city.`id` order by user_city.id desc

技术分享 都使用到了索引,orderby为驱动表字段,不会出现Using temporary; Using filesort

技术分享

7.explain select users.id from user_city left join users on users.user_id=user_city.`id` order by user_city.id desc

技术分享 user_id没有索引,即使orderby字段为驱动表字段

技术分享

补充一点

技术分享

一般能用join肯定用join,因为吗、这样的话mysql就会自己判断选择合适的驱动表了

技术分享

技术分享

技术分享

 

关于mysql的join