网站首页 > 基础教程 正文
前言
我们先来看一下阿里开发手册的描述:
手册上写着【强制】,但是我相信很多同学项目里面的代码都不满足这个要求。但是关键问题是:不用join,这SQL究竟要怎么写啊!
高性能MySQL
高性能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';
可以分解成下面这些查询来代替:
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
后面的参数可能会过多,可见这个方案的通用性其实非常有限。
知乎
我们看一下知乎数据库大佬李晨曦的回答。(原地址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了,查询的性能就可以提高很多了。任何的规范都是在特定情况下的某种妥协,脱离了这个环境,就不一定成立了。
需要说明的是,这种脱离范式的设计,是互联网业务在设计高并发表时惯用的做法!
具体问题具体分析
最后,笔者需要多说几句:具体问题具体分析,规则是死的,人是活的!即使多表Join在阿里规范是强制不允许的,但是笔者依然认为,在比如管理后台这类并发量很低的业务场景下,依然是可以进行多表Join操作的!
多表Join并不一定是很Low的做法,在错误场景下多表Join才是很Low的做法!任何东西都不要一杆子打死!
猜你喜欢
- 2024-10-11 SQL语法——右连接 RIGHT JOIN 关键字
- 2024-10-11 数据筛选,如何像SQL一样使用Pandas完成JOIN连接、UNION合并查询
- 2024-10-11 SQL多个Join on 和Where间的执行顺序(nest loop join机制)
- 2024-10-11 SparkSQL大数据实战:揭开Join的神秘面纱
- 2024-10-11 SQL INNER JOIN 关键字 sql关键字union
- 2024-10-11 阿里规范不建议多表join,可这SQL要怎么写
- 2024-10-11 SQL RIGHT JOIN 关键字 sql语句 关键字
- 2024-10-11 Apache Flink 漫谈系列-JOIN 算子
- 2024-10-11 awk实现类sql的join操作 awvs结合sqlmap
- 2024-10-11 扩展FlinkSQL实现流与维表Join flinksql mysql维表
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)