① sql连表查询跟一个个表查询那个快各有什么优点和缺点
SQL连表查询称为联合查询,一个个表查询是单查询。两者的区别和优缺点如下:
1、从开发效率来看:
联合查询是需要多个单查询进行逻辑组合才能完成的查询的工作,联合查询仅仅需要一个SQL就可以完成查询工作,即把业务逻辑放到了SQL中,由数据库来处理,相对来说开发效率会比较高些。
2、从查询效率来看:
单查询的可重用性较高,所以效率相较之联合查询会更高。
在数据库进行读写时,数据库会用锁机制,限制其他连接对其操作。由于联合查询查询速度比单个查询要慢很多,这样联合查询会增加锁的竞争关系,所以用单查询会更好。
3、从逻辑架构分层原则来看
关联关系代表了业务规则/逻辑,如果大量使用关联查询,就是把大量的业务规则和逻辑放在数据库来执行了,数据库消耗cpu、内存、io等资源会大大增加。
4、从资源利用率方面看
大部分场景下,并不是所有关联查询的结果都被有效使用了。例如后台管理的列表界面会分页显示,关联查询的结果集,只有当前页的数据被使用,但数据库需要消耗额外资源得到全部结果集。
5、从架构的伸缩性方面看
大量的关联查询会导致集中式的数据库架构很难向分布式架构转换,伸缩性方面的优化难度高。关联查询方便快速,开发效率比较好。
不使用关联查询在架构层面有很多优点,但对系统分析和设计、开发能力要求高。一般在互联网行业等用户数较多的情况下最好重视这方面。
题主的两个查询由于数据量不多,效率上基本没有差别,但在实际应用中要根据数据量、业务复杂度等去综合评估。
② 做逻辑运算时,写程序里好还是sql数据库里好
做
逻辑运算
时,写程序里好还是
sql数据库
里好
如果你的数据库服务比较繁忙,还是放到CS中处理较好。
数据库的任务主要是保存数据/查询数据
计算的事,能放在CS中尽量放到CS中。
③ 数据库系统优化--业务逻辑设计优化
【IT 技术分析】
当我们优化一个系统时 有时发现一种情况就是自己修改SQL 索引以及分区是不能解决性能问题的 这时你要考虑业务逻辑优化和表设计的重构 这两点的确和设计结合的很紧密
业务逻辑优化
结合实际 我们先谈谈业务逻辑优化
案例一
我们的系统一个文档模块 客户点击时很慢 通过性能分析 是点击是去查询数据库 这散源时系统是通过Hibernate来两步处理
计算该类型的文档数量总数
显示最新文档的前 篇文档
这时显示第二步的时间是很快的 只取 条记录 但是计算该类型的所有总数很慢 系统的这时的输入是很大的(计算该类型的全部文档 可能有几万篇数据) 输出就一条总数 这时因为业务逻辑复杂 即使建立索引 分区等等速度也是无法提高 因为不能真正做到索引覆盖和分区消除
客户是点一下要等十几秒是不能容忍的 这时可能输入数据量很大下 数据库很可能采用的是hash联结 而且并发用户一大 数据库服务器压力很大
这时常规的优化方法是没有效果的 这时我们也发现 客户其实对以前比较老的数据是不关心的 一般只是对近期的数据比较感兴趣 所有我们就在查询时默认设定半年的时间 然后在时间上设定聚集索引 并默认在此时间上排序 使其使用合并联结 减少输入数据量 结果速度有明显的提升
案例二
我们在优化一个客户系统时 碰到一种情况 在客户的一选择功能时 客户点击一下选择相关数据 这时页面要要几分钟才能出来 客户很不满意 这时修改sql和索引都没有办法 他的输入的数据量也很大 和上面一下也要计算总数和取最新前几条数据
这时我们在查询是关联了人员 通过调查 发现客户只对和自己相关的数据感兴趣 也只是查询自己相关的数据 所以这时在sql语句里增加用户id这条限制 同时在增加userid的索引 这样一来 速度就大大提高
总结
当然以上两个案例 是从输入入手 减少输入和输出的数据量 主要优化业务逻辑 达到优化系统 当然有些情况要和客户确认和说服他们 有时他们不一定都认可 这时要说明这样做的目的 相信他们也会理解
表设计优化
表设计 在我们开发系统时已经确定 好的设计的确能大大提高性能 我们在优化系统时 碰到段掘埋一个比较麻烦的问题
原文 数据库重构(一) 字段合并
这条sql是判断 个维度 一个用户id 一个机构id 一握蚂个岗位id 还有级别判断和是否公共 sql语句里有 个 or 组成查询 表数据一大就表扫描 性能很差 但业务要求和系统要求这样判断 即使在表中这五个字段都建索引 速度也不会快 太多 OR 了 SQL Server 查询分析器无法优化
这时由于设计时 用户id 机构id 岗位id为 个只有一个有数据 所以将这 个字段合并 较少 Or 语句 让数据库能使用索引
总结
lishixin/Article/program/SQL/201311/16321
④ 一个Java程序员有必要精通SQL么
程序员精通SQL是最基本的要求
因为做的程序是需要跟数据进行交互的,没有数据交互的程序,应用层面太狭隘了。
国外的岗位区分的很明确,专门写代码的,专门做数据库的,即便如此,也有区分,专门处理前台的、后台,专门做框架的架构师,还有专门的测试工程师。
但是国内不同,基本上程序员要掌握除了架构以外的全部技能。可以说国内的一流程序员就是万能的,什么都会。
这个也导致了国内IT行业从业人员入门的门槛高,培训不规范。新人不知道该从何入手。
现在国内的IT行业人才缺口很大。这个问题,本身跟行业规范也有一定原因。
作为刚刚进入行业的程序员,第一考虑的是自身能力一定要跟上公司的技能需求,然后在此基础上不断学习,有方向有机会的学习新的技能。这样才能拿到高薪。