咱们先来看一下阿里开发手册的描述mysql
手册上写着【强制】,可是肥朝相信不少同窗项目里面的代码都不知足这个要求。可是关键问题是,不用join,这SQL究竟要怎么写啊!sql
高性能MySQL这本书相信你们都看过,在分解大的查询
这部分提到。数据库
分解关联查询,即对每一个要关联的表进行单表查询,而后将结果在应用程序中进行关联。下面的这个查询:编程
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id=tag.id
JOIN post ON tag_post.post_id=post.id
WHERE tag.tag = 'mysql';
能够分解成下面这些查询来代替:ide
SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id = 1234;
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904);
可是该方案也会有很明显的问题,就是in
后面的参数可能会过多,可见这个方案的通用性其实很是有限。post
咱们看一下知乎数据库大佬李晨曦的回答。(原地址https://www.zhihu.com/question/56236190/answer/153450286)性能
建表的时候,就把这些列放在一个表里,好比一开始有student(id, name)
,class(id, description)
,student_class(student_id, class_id)
三张表,这样是符合数据库范式的(第一范式,第二范式,第三范式,BC范式等),没有任何冗余,可是立刻就不符合“编程规范“了,那咱们能够用一张大表代替它,student_class_full(student_id, class_id, name, description)
,这样name和description可能要被存储多份,可是因为不须要join了,查询的性能就能够提升不少了。任何的规范都是在特定状况下的某种妥协,脱离了这个环境,就不必定成立了。spa
该解决方案的具体作法和利弊肥朝认为说得很清楚了。code
那么,大家公司是否有不少多表join的状况呢?是用哪一种方案解决,仍是说,直接当作没看到不解决!欢迎留言告诉肥朝。blog