mysql优化-join

198 阅读2分钟

1、mysql不推荐使用子查询和join

1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据。

2.子查询就更别用了,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。

3.如果是JOIN的话,它是走嵌套查询的。小表驱动大表,且通过索引字段进行关联。如果表记录比较少的话,还是OK的。大的话业务逻辑中可以控制处理。

4.数据库是最底层的,瓶颈往往是数据库。建议数据库只是作为数据store的工具,而不要添加业务上去。

  • 子查询示例
select * from user where id in (select user_id from user_role where role_id = 2)
  • join示例
select u.* from user u left join user_role ur on u.id = ur.user_id where ur.role_id = 2

2、Left join 、Right join 和 Inner join的选择

1.尽量避免使用 Left join 或 Right join,而用 Inner join

2.在使用 Left join 或 Right join 时,ON 会优先执行,where 条件在最后执行,所以在使用过程中,条件尽可能的在 ON 语句中判断,减少 where 的执行

3、建议

对于一些小表来说,数据量没这么大,为了减少代码逻辑,使用join查询也无可厚非,但是如果能预测到数据量未来会增长到一个很大的量级,最好还是不要写这么多的复杂SQL JOIN,尽量将这些逻辑维护在代码里,这样对于后面SQL优化,或者分库分表的拆分,都会带来极大的好处