优先使用单表查询,而非联合查询

优先使用单表查询,而非联合查询

发表于2016/7/4 17:49:09  1866人阅读

分类: 研发架构

 一、小雷的见解
 1.编码规范

CRUD,命名规范,可以通用。
  比如类名、方法名、变量名,都很接近。

2.开发效率

复制粘贴很方便。

自动化生成很爽。

标准API容易定义。
  针对单表的链式操作框架,也很多。

3.代码简单易懂

一个表,再复杂的sql,很快也能看懂。

一般的sql,刚刚毕业的大学生,也看得懂,写得出来。
     <select id="get" resultType="cn.fansunion.shopping.Order">

select <include refid="columns" />

from order_order

where id =

#{id}

</select>

4.分库分表

数据量大了之后,分库分表,sql基本不受影响。

话说当当开源的sharding-jdbc,不支持联合查询吧。

https://github.com/dangdangdotcom/sharding-jdbc

5.可扩展强

持久层API,职责单一,很容易重新组合。

6.缓存

单表查询的数据比较明确,缓冲命中率高。

如果是多表查询,其中1个表变了,另外1个表没变,还需要重新查询。

二、海尔电商总监-Richie  

简单说说

1. 从逻辑架构分层原则来看

关联关系代表了业务规则/逻辑,毫无约束大量使用关联查询,就是把大量的业务规则和逻辑放在数据库来执行了,数据库消耗cpu、内存、io等资源进行关联操作,实际上是在做应用该做的事情。

2. 从资源利用率方面看

大部分场景下,并不是所有关联查询的结果都被有效使用了。例如后台管理的列表界面,通常都会分页显示,关联查询的结果集,只有当前页的数据被使用,其他都是无用的,但数据库需要消耗额外资源得到全部结果集,再从中得到当前页数据。

3. 从架构的伸缩性方面看

大量的关联查询会导致集中式的数据库架构很难向分布式架构转换,伸缩性方面的优化难度高。

关联查询方便快速,开发效率比较好,如果系统、数据库经过一些垂直优化手段完全能够满足性能要求是可以使用的,例如中小企业的内部管理系统等。

不使用关联查询在架构层面有很多优点,但对系统分析和设计、开发能力要求高。一般在互联网行业等用户数较多的情况下最好重视这方面。

理论上不存在什么复杂场景,如果不使用数据库的关联查询就无法满足需求的。巨无霸的ERP系统SAP,基本整个系统功能都是用单表查询实现的

https://www.zhihu.com/question/21319692/answer/35443564

三、《高性能MySQL》-权威解读

https://www.zhihu.com/question/21657443

小雷FansUnion-一个有创业和投资经验的资深程序员-全球最大中文IT社区CSDN知名博主-排名第122
博客:http://blog.csdn.net/fansunion 
2016年7月4日:今天又在下大雨
湖北-武汉:长江告急!水势凶猛啊!

时间: 2024-08-29 22:53:05

优先使用单表查询,而非联合查询的相关文章

mysql的缓冲查询和非缓冲查询

最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的最大内存已经耗尽.遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据.可想而知,4万条数据全部加载到内存中,内存不爆才怪. 毕竟编程这么

mysql 标量子查询和非法子查询

#where或having后面:#标量子查询(单行子查询)#列子查询(多行子查询)#行子查询(多行多列) 特点:子查询放在小括号内,一般放在条件的右侧,标量子查询一般配备单行操作符使用单行操作符:<> >= <= < >列子查询:一般搭配着多行操作符使用多行操作符:in.any.some.all #标量子查询#案例:谁的工资比ABEL高的员工信息 SELECT * FROM employees WHERE salary>( SELECT salary FROM e

Hibernate单表操作(六)——查询记录get()与load()方法区别

转载请注明:http://blog.csdn.net/uniquewonderq 在上一次的案例中,通过get或者load方法得到的结果一样. 既然得到的结果一样, 那么  get和load方法查询记录的区别是什么呢? 区别一: 在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,发出selelct语句,去查找这个记录或者说对象,返回本身的持久化对象. load方法会在调用后返回一个代理对象. 该代理对象只保存了实体对象的主键id,直到真正使用对象的非主键属性时才会发出sql

union联合查询将两个表的查询结果在一个表中显示

表格ChannelReward和表格RewardSuppleSettle中都有一下几个字段JSMonth, ChannelNo, RewardSum, RewardItem.要将两个表中RewardSum>0的记录都显示在一个表中,可以使用联合查询 select * from(SELECT     JSMonth, ChannelNo, RewardSum, RewardItem, '1' AS ObjectTypeFROM         dbo.ChannelRewardWHERE    

ORM 单表操作查询 多表操作查询及增删改查

------------------------------------------只有对前途乐观的人,才能不怕黑暗,才能有力量去创造光明.乐观不是目的,而是人生旅途中的一种态度. 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email. 书籍模型: 书籍有书名和出版日期

八:SQL之DQL数据查询语言单表操作

前言: DQL数据库查询语言是我们在开发中最常使用的SQL,这一章总结了单表操作部分的常用查询方式 主要操作有:查询所有字段.查询指定字段.查询指定记录.带IN的关键字查询,范围查询,陪查询.查询空值 带AND的多条件查询.带OR的多条件查询,关键字DISTINCT,查询结果排序,分组查询.分页查询等 准备好数据测试表 1 mysql> select * from student; 2 +------+----------+-------+----------+-------------+ 3

django orm 单表增删改查

一 简单增删改查 1.增 User.objects.create(name='Alan', age=10, birthday='2018-08-08') user = User(name='Alan', age=10, birthday='2018-08-08') user.save() 2.查询 # 操作的结果拥有是一个list users = User.objects.filter(name='Owen') # 只能操作有且只有一条数据记录 user = User.object.set(id

TimesTen 数据库复制学习:3. 配置Classic Replication单表复制

本文为一个动手实验,配置传统复制模式中的单表复制(非复制整库),配置2个数据库, master和一个subscriber.拓扑如下: 为简化,master和subscriber位于同一主机.同时,为和上一个实验保持一致,master和subscriber的DSN分别为master1和subscriber1. 创建DSN [ODBC Data Sources] master1=TimesTen 11.2.2 Driver subscriber1=TimesTen 11.2.2 Driver [ma

20141104--SQL连接查询,联合查询

1 ---------------------------连接查询-------------------------------- 2 --横向连接查询 3 --可以将子查询放在from之前,用来替换显示出来的信息 4 select name as 名字,sex,age,(select name from bumen where bumen.code=biao2.bumen)部门,(select ceo from bumen where bumen.code=biao2.bumen)as ceo