提高数据库并发性能概要

Table of Contents

  • 1 细粒度锁表
  • 2 拆表
    • 2.1 物理拆分方式
    • 2.2 逻辑拆分方式
  • 3 多数据源(多库)
  • 4 乐观锁
  • 5 临时表
  • 6 缓存
  • 7 数据库集群
  • 8 读写分离策略
  • 9 SQL优化
  • 10 正确使用索引

1 细粒度锁表

  1. 减少大事物操作 (一个包含很多SQL语句、牵涉很多表的大事物操作锁住的资源也会多);
  2. 尽量不使用表级排他锁,而是用行级锁;又因为锁一般是由数据库根据你的 SQL自动分配,所以要注意SQL的写法。比如
    select * into B from A

    该操作会创建B表,并对B表加表锁。

2 拆表

与降低锁的粒度异曲同工。

2.1 物理拆分方式

  1. 水平拆分: 把不同行记录分开放进不同表中。比如男性放入一张表中,女性放入另一张表。
  2. 垂直拆分: 把不同列分别放入不同表中。比如主用户信息放入一张表,附加信息放入另一张表。
  3. 混合拆分(水平拆分+垂直拆分)

2.2 逻辑拆分方式

  1. 按范围拆分,比如所有zipcode列的值 between 70000 and 79999的记录拆成一个表.
  2. 分组拆分,比如country列为冰岛、挪威、瑞典、丹麦这些北欧国家的记录拆成一个表
  3. 哈希拆分:参见数据库的哈希设计:http://hi.baidu.com/dapplehou/blog/item/471a277ff8eafc0529388ac4.html
  4. 混合拆分,以上几种拆分方式的综合。
  5. 可建立查找表以方便对拆分的子表进行登记、查询、定位。

3 多数据源(多库)

本质是拆库。与拆表异曲同工。数据库路由(定位),对于程序员来说就是数据源路由(查找、定位),需要定义多个数据源,并采取合适算法进行定位。可参考 http://hi.baidu.com/dapplehou/blog/item/6ba8034f5114e038aec3abdb.html 多库部分.

什么是合适算法?那要根据库的切分方式、性能需要以及业务需要来定夺。

4 乐观锁

可以降低数据库长事物。只在提交的那一刹那判断自己提交的数据是否已经被别人修改过了,如是,则认为自己要提交的数据是过期数据,取消提交,否则,提交成功。避免长事物带来的等待。通常采用版本号来判断是否过期数据。过程如下:

  1. A、B两人同时读取同一条银行账户记录,记录版本号为1。
  2. A修改此记录:增加100元,版本号加1。
  3. B修改此记录:减少50元,版本号加1。
  4. A提交。假设提交SQL如下:
    update account set money=money+50,version=version+1 where id=10 and version=1

    提交成功。id=10的这条记录version为2.

  5. B提交。提交SQL如下:
    update account set money=money-50,version=version+1 where id=10 and version=1

    因为version已经等于2了,所以这条更新语句会影响0行。这样,谁先提交,谁成功。后来者的不会因为先到者读取后迟迟不提交而等待等待。减少了站着茅坑不拉屎的情况。提高了并发性能。

5 临时表

使用局部临时表提高并发性能。局部临时表特点是多用户操作互不干扰。一个局部临时表只对一个session可见、有效。多用户并发实际是各操作各自的临时表,不会产生数据表锁的问题。提高并发效率。

SQL Server创建临时表语句:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)

Oracle:

CREATE GLOBAL TEMPORARY TABLE MyTempTable

把主表(频繁使用又数据量大)中的部分数据放入局部临时表,然后在临时表里进行计算、统计等工作,然后同步到主表中去(同步过程可用乐观锁机制),减少了主表在并发时锁等待的开销。

临时表性能提升原理和拆分表原理相同:通过把一个大集合拆成小集合,然后在小集合上进行计算。

6 缓存

  1. 原理同临时表。先在内存里折腾(计算、update等),然后把折腾的结果一次性的同步给db(同步过程可使用乐观锁机制).
  2. 算法优化。

    有的操作,虽然没有更新过程,但频繁的复杂查询也会使数据库性能降低。这种情况下,可采取把一些查询后的结果且不轻易变的数据保存在缓存中供后续使用。

    例如:不同用户登录后的菜单显示可能要根据不同部门、不同权限以及委托、兼职等复杂逻辑来确定菜单的显示项,数据库的查询可能非常消耗性能,这种情况下,可缓存所有菜单形成菜单池,再采用亨元模式,缓存每个用户的可见菜单,这样减少了数据库查询次数,避免了显示菜单时每次都要查询数据库的性能损耗。

    亨元模式可参见:http://hi.baidu.com/dapplehou/blog/item/aeca1d958268e1047bf48089.html

7 数据库集群

与多库(拆库)区别: 集群是每个库上都有一份相同的数据;拆库是每个库只有全集的部分数据。

多数据库冗余可以减少单个数据库的负载,总体上提高了性能。它有3个技术关键点:

  1. 数据库查询路由
  2. 数据库同步
  3. 负载均衡算法

8 读写分离策略

在读操作远多于写操作的大型应用中,可采用读写分离策略。用来读的数据库叫从数据库,用来写或者事务性查询的叫主数据库。主数据库的数据变化会通过某些策略(比如数据库复制)同步到从数据库,从而保证主从数据库数据一致性。其本质是空间换时间,即:通过增加数据库冗余,降低数据库对锁的复杂调度。但另一方面,增加了应用架构的复杂度 (这种复杂性可以通过使用第三方中间件来降低)。

9 SQL优化

SQL语句是数据库资源消耗的主要来源,它往往都是可以进一步优化的,SQL优化在时间成本和风险上代价低。

我们写的SQL语句都会被查询优化器自动优化,它的优化原则是这样的:

1. 选择运算优先运行。(即优先通过条件过滤记录集)
2. 投影运算与选择运算同时进行。
3. 将笛卡尔积与随后的选择运算合并为连接运算
4. 投影运算与其他运算同时进行
5. 寻找公共子表达式并将结果加以存储
6. 对文件进行预处理

由于有了以上优化,所以下面两种SQL的写法效率一样

select * from A,B where A.id=B.id and A.name='Jake'
select * from A,B were A.name='Jake' and A.id=B.id

随着数据库的进化,原来效率低的语句现在不一定低,需要实际测试。

10 正确使用索引

  1. 索引列
    1. 经常查询的列
    2. 经常排序的列
    3. 经常连接的列
  2. 非索引列
    1. 不经常使用的列
    2. 重复记录太多的列(比如性别)
    3. Image text类型的列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java软件需求分析、概要设计、详细设计和数据库设计是Java软件开发的一系列重要步骤,下面分别进行详细介绍。 Java软件需求分析 Java软件需求分析是软件开发的第一步,它涉及到对软件的需求进行深入全面的研究,了解用户的需求和期望,并根据这些需求和期望建立一个可行的软件开发方案。Java软件需求分析需要采用多种技术手段,如面试用户、需求调研、竞品分析等,确保软件能够满足用户的要求,具有较高的用户体验和市场竞争力。 Java软件概要设计 Java软件概要设计是在需求分析基础上进行的,在需求分析的基础上,进行大致的设计,包括架构设计和模块划分设计等,是一次全面的系统设计,涉及到功能模块、性能并发、安全等各个方面。Java软件概要设计需要进行多次调整和优化,确保软件的可行性和适应性,并最终进行详细设计。 Java软件详细设计 Java软件详细设计是在概要设计完成后,对软件进行进一步的细化设计,将问题具体化并提供详细的解决方案,在达到要求的同时尽可能的降低实现难度。Java软件详细设计需要考虑到软件的可维护性、可扩展性、性能、安全等各方面因素。详细设计是Java软件开发的关键步骤,对代码编写的质量和工程实施效率影响至关重要。 Java数据库设计模板 Java数据库设计是Java软件开发中的重要步骤之一,需要根据软件的需求,对数据库进行设计,此时可以选择使用信息建模工具,如ERwin、PowerDesigner等。数据库设计需要保证数据库的规范化,减少数据冗余和数据泄漏,提高数据使用的安全性和有效性。常用的Java数据库设计模板有:实体关系模型、UML类图、数据流程图等,这些模板可以帮助开发者有效地进行数据库设计,提高Java软件的开发效率和质量。 ### 回答2: Java软件开发过程中,需求分析、概要设计、详细设计、数据库设计都是非常关键的环节。下面通过以下四个方面来说明模板的作用: 1. 需求分析模板 需求分析是Java软件开发的第一步,对于整个项目的成功关系到它的正确性与完整性。需求分析模板包含以下几个方面:业务描述、功能需求、性能需求、接口需求和其他相关需求。这些都是开发团队了解需求并达成共识的基础。 2. 概要设计模板 概要设计模板主要是为了规范Java软件项目的总体设计,在这个阶段中,开发团队应对整个系统进行整体的设计,包括整个系统的架构、模块划分、主要技术方案、关键算法选择等等。通过概要设计模板开发团队进行详细分析与讨论可以确保项目的可行性。 3. 详细设计模板 详细设计模板是对概要设计模板的补充和细化。在此阶段中,开发团队将进一步深入地设计系统中各个模块的详细设计方案,包括各个类之间的接口定义、数据结构设计、中间件组件选择、交互协议定义等等。详细设计模板的作用便是将概要设计的总体规划转化为更具体、更具执行性的方案。 4. 数据库设计模板 数据库是Java软件项目中核心的组成部分之一,因此,数据的设计模板是非常重要的。在这个环节中,开发团队应该深入了解项目实际需求,并根据需求设计出适当的数据库存储模式。关于数据的设计,包含一些列的数据表之间的关系、数据表字段的定义,以及数据存储的相关要求。数据库设计的模板非常重要,一旦设计错误,也可能会导致系统无法正常运行,因此,正确的设计模板是至关重要的。 综上可以看出,Java软件需求分析、概要设计、详细设计、数据库设计模板是整个Java软件开发过程中非常重要的一部分。它们可以规范开发团队的行动,并确保项目的可执行性和开发效率。因此,选用正确的模板可以在Java软件开发中帮助团队节省大量时间和金钱。 ### 回答3: Java软件需求分析通常分为四个阶段:需求收集、需求分析、需求规格说明和详细设计。其中,需求收集可以通过与客户交流、考虑业务流程、分析用户行为等方式收集需求;需求分析则需要基于收集到的需求,明确软件功能、性能、可靠性、安全性等各方面的要求;需求规格说明则是根据分析结果,撰写文档明确软件需求;详细设计则是在需求规格明确的基础上,制定开发计划,定义开发流程,完成软件架构、模块设计、接口设计等。 Java软件概要设计是在需求规格说明的基础上进行的,包括系统架构、模块划分、数据流程图等等,主要是为了明确系统的大体框架、功能模块和关键技术,使开发人员对系统的实现过程有一个整体性的认识。 Java软件详细设计是在概要设计基础上进行的,包括详细的模块设计、软件界面设计、数据库设计等等。详细设计需要充分考虑开发的各个方面,从技术细节到用户体验方面都要有深入的分析和设计。 数据库设计模板是指规范了数据库设计的文档,包括逻辑设计、物理设计以及数据库操作等。它是Java软件开发流程中很重要的一环,因为数据库是整个系统的核心,设计需要考虑数据安全、性能优化等方面,以保证系统的稳定性和可扩展性。数据库设计模板可以根据实际需要进行修改和补充,以达到最佳的设计效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值