百科问答小站 logo
百科问答小站 font logo



《阿里巴巴JAVA开发手册》里面写超过三张表禁止join 这是为什么?这样的话那sql要怎么写? 第1页

  

user avatar   chenxi_li 网友的相关建议: 
      

一:为什么做这种限制?

打个比方,如果我有无限的钱,我想买个豪华别墅,想买个跑车,想买个直升飞机,但现实是我没钱,只能租房住,只能走路上下班。。

如果数据库的性能无限强大,多个表的join肯定是需要的,尤其是复杂的分析型(OLAP)查询,甚至可能涉及10几个表的join,但现实是大部分数据库的性能都太弱了,尤其是涉及到多表join的查询。给@韩飞点个赞,国内懂这个做这个的太少了,以后就靠他们了

规范一看就是在使用MySQL时的限制(这种规范实际上迫不得已的限制),做这个限制有两个原因:一是优化器很弱,涉及多个表的查询,往往得不到很好的查询计划,这块比较复杂,感兴趣的朋友可以关注我,我以后会写文章专门介绍;二是执行器很弱,只有nested loop join,block nested loop join和index nested loop join。

1. nested loop join就是分别从两个表读一行数据进行两两对比,复杂度是n^2

2. block nested loop join是分别从两个表读很多行数据,然后进行两两对比,复杂度也是n^2,只是少了些函数调用等overhead

3. index nested loop join是从第一个表读一行,然后在第二个表的索引中查找这个数据,索引是B+树索引,复杂度可以近似认为是nlogn,比上面两个好很多,这就是要保证关联字段有索引的原因

4. 如果有hash join,就不用做这种限制了,用第一个表(小表)建hash table,第二个表在hash table中查找匹配的项,复杂度是n。缺点是hash table占的内存可能会比较大,不过也有基于磁盘的hash join,实现起来比较复杂

二:在这种限制下SQL怎么写?

可是我确实需要两个表里的数据链接在一起啊,我们可以做个冗余,建表的时候,就把这些列放在一个表里,比如一开始有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了,查询的性能就可以提高很多了。

任何的规范都是在特定情况下的某种妥协,脱离了这个环境,就不一定成立了。




  

相关话题

  Linux命令行输入whereis mysqlm,没有返回结果,请问怎么回事? 
  数据库设计时的一些细节的东西如何处理? 
  新浪微博「点赞功能」数据库如何设计的? 
  为什么很多公司都开始去 Oracle 而使用 MySQL? 
  Cache 和 Buffer 都是缓存,主要区别是什么? 
  Linux命令行输入whereis mysqlm,没有返回结果,请问怎么回事? 
  新浪微博「点赞功能」数据库如何设计的? 
  怎么通过类型形式化地表达SQL语句? 
  这条语句违背了C++哪个原则? 
  Cache 和 Buffer 都是缓存,主要区别是什么? 

前一个讨论
求鉴定本人是否为直男癌,渣男?
下一个讨论
为什么互联网公司要提供框架、UI库或者接口给广大开发者使用?只是为了展现公司实力吗?





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利