最近一直在困扰的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就会自己判断选择合适的驱动表了