前言

我们先来看一下阿里开发手册的描述

图片

手册上写着【强制】,但是肥朝相信很多同学项目里面的代码都不满足这个要求。但是关键问题是,不用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的情况呢?是用哪种方案解决,还是说,直接当做没看到不解决!欢迎留言告诉肥朝。



图片



更多相关文章

  1. 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(07) 范式与反模
  2. 数据库-范式
  3. 我需要从jquery ajax post中撤回数据并将数组分解为单独的输出
  4. debain 系统 ll 命令无法使用.目录和文件没有颜色区分解决之道
  5. Mysql 范式、索引、视图、事务、sp等概念简介
  6. oracle基础知识总结 part 3 : 三范式,PLSQL,存储过程,函数,触发器

随机推荐

  1. 准大学生,如何预习计算机专业?
  2. 这道算法题用「动态规划」求解可麻烦了!
  3. 新手如何有效的刷算法题(LeetCode)
  4. 转:基于 Android(安卓)NDK 的学习之旅----
  5. 讲道理,MD5 到底是不是加密算法?
  6. 神器面世:快速生成你的专属卡通头像!
  7. 一个有意思的分钱模拟问题
  8. 如何设计一个支持增量操作的栈
  9. Markdown 必备神器
  10. 《Python知识手册》,V3.0版来了,2021年,走起