关于mysql的join

Posted tianye_guazi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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的主要内容,如果未能解决你的问题,请参考以下文章

关于 MySQL LEFT JOIN 你可能需要了解的三点

关于Mysql使用left join写查询语句执行很慢的问题解决

关于mysql,需要掌握的基础:CRUD存储引擎单表查询相关多表查询join事务并发权限管理等等

Day898.Join语句执行流程 -MySQL实战

关于full join 语句的性能问题 跪求大虾帮忙解决.

关于SQL数据库中cross join 和inner join用法上的区别?