数据库开发-2-开发数据库的要点

article/2025/9/30 2:20:48

Lec2-开发数据库的要点

1. 开发成功数据库应用的特点

  1. 需要理解数据库体系结构
  2. 需要理解锁和并发控制特性:每个数据库都以不同的方式实现
  3. 最重要的是不要把数据库当"黑盒"
    1. 要了解每一个数据库的体系结构和特征
    2. 最常见的问题就是因为我们对数据库本身了解不足
  4. 性能、安全性都是适当的被设计出来的
  5. 用尽可能简单的方法解决问题:"创造"永远追不上开发的步伐
  6. DBA和RD之间的关系

2. 数据库体系结构的差异

  1. 不能把数据库当成"黑盒"使用,因为每个数据库都是非常不同的
  2. Oracle和MySQL的差别(连接等多方面),类似
    1. Windows和Linux的差别:进程
    2. iOS和Android的差别
    3. 虽然都是DBMS,但它们也有相当的差异
    4. Oracle的连接是很重量的(要先预处理很多的东西,所以反复断开和连接会导致性能下降),MySQL的连接是很轻量的。
  3. 了解这种差异,了解你所使用数据库的特性,是开发成功数据库应用的基础

3. 并发控制

3.1. 并发控制的问题

  1. 现实存在并发,我们需要保持数据的一致性,所以要做并发控制
    1. 并发数和消耗的资源时间并不是完全线性关系,当并行数到达一定数量后,消耗的资源时间会呈指数型上涨(管理排队队列时间等)
    2. 可能会导致上下文切换问题(整个数据库的问题)
    3. 最后可能导致整个数据库的问题,称为上下文切换
    4. 开发环境和生成环境的数据库是不一致的,可能会出现问题。
    5. 数据库的问题很难调试
  2. 锁机制,使得并发控制成为可能:二段锁
  3. 不同的数据库,实现锁机制是不一样的

3.2. 比如:Oracle的锁机制就比较特别

  1. 锁机制甚至会导致无法读取正确数据
  2. 这个时候T6,Transaction1能提交吗?
    1. 如果接受了这种提交,那么则会得到错误的值(Oracle的实现)
    2. 如果不接受这种提交,那么需要检查时间戳和退回

3.3. Oracle存在有时读不到正确数据的现象

  1. Oracle的多版本控制,读一致性的并发模型
    1. 读一致查询:对于一个时间点(point time),查询会产生一致的结果:永远能读到开始读的时间点的数据(而不是修改后的数据)
    2. 非阻塞查询:查询不会被写入器阻塞,但在其它数据库中可能不是这样的

  1. 对于左侧,打开游标时,不会读取数据,只有在读取游标时才会读取数据
  2. 对于右侧,如果我们删除了所有的表,但是我们在Oracle中仍然可以使用之前打开的游标来读取那个时刻的数据
  3. 事实上,打开游标的时候确实没有复制,删除数据的时候也确实删除了,但是删除数据的时候Oracle为我们使用Undo日志来保存了下来(我们记作Undo statement),是删除的回滚段,游标从这类读出数据。

3.4. Oracle这种锁机制的好处是什么?

  1. 读不阻塞写,可以极大程度上提高数据库的吞吐能力,我们将这个特征读作散回特性
  2. 例子:
    1. ACCOUNTS(account_number, account_balance)一个银行的账户余额
    2. 为了简单,只考虑一个仅有四行的表(同时假设每个数据库块中只存放一行数据。)
帐号余额
1500
2250
3400
4100
  1. 我们想运行一个日报表,了解银行里有多少钱。下面是一个非常简单的查询:Select sum(account_balance) from accounts;
  2. Oracle和其它数据库在并发上的差别(一致性读):Oracle就没有读共享锁

3.5. 从体系结构和特性中了解具体数据库的锁机制

  1. 比如Oracle实现的锁机制
    1. 只有修改才加行级锁
    2. Read绝对不会对数据加锁
    3. 读写器绝对不会阻塞写入器

3.6. 课后思考

  1. 对大多数码农而言,数据库锁机制好像都是自动和透明实现的,那么深入了解每个数据库的锁机制实现细节,对码农编码有什么影响嘛?
    1. 不同的数据库所对应的锁机制往往有一些不同
      1. 很容易出现意料之外的错误。比如orcale出现同时读写时的数据不一致
      2. 在选择数据库时会出现很大的困难。
      3. 很多时候在数据库默认的锁机制下,也会出现死锁现象,需要及时对其进行修改,修改的前提是对底层的了解。
    2. 锁机制作为底层的实现细节,其变化相比表层的语法而言,可以说变化很小。了解底层细节的码农,面对操作变化相对来说就有了更加大的灵活性。
  2. 根据这节课Oracle的锁机制特征的分析,你尝试去了解一下MySQL、SQLServer这些其它数据库锁机制实现的特征
    1. Mysql:
      1. 不同存储引擎支持不同的锁机制
      2. 读写操作前必须对数据上锁,且最好一次性请求足够级别的锁
      3. 读共享,写独占
    2. SQLServer:
      1. 支持多种锁级别和隔离级别
      2. 默认由系统自动管理锁和锁粒度,并负责锁升级

3.7. 程序员的工作

3.7.1. 开发成功数据库应用的要点-黑盒的问题

对大多数码农而言,数据库锁机制好像都是自动和透明实现的那么深入

3.7.2. 问题是:这对我们码农有什么影响吗?

  1. Oracle的无阻塞设计有一个副作用,就是如果确实想保证一次只有一个用户访问一行数据,就得开发人员自己做工作。
  2. 例如:一个资源调度程序主要有两张表:
    1. Resources(Resource_name,other_ data)
    2. Schedules(resource_ name, start_time, end_time)
  3. 往Schedules中插入一个房间预订之后,提交之前,应用将查询
Select count(*)From schedulesWhere resource_ name =:resource name FOR UPDATEand (start_time < :new_end_time) and (end_time > :new_start_time)
  1. 不能把数据库当成黑盒使用:必须深入了解你所使用的数据库体系结构和特征
  2. 什么时候,码农需要自己考虑并发的问题?不确定,这需要看具体的情况

4. 黑盒的问题

  1. 数据库黑盒独立性的问题
  2. 数据库的某些细微差异会对开发造成影响

4.1. 黑盒和数据库独立性的问题

  1. 数据库有脱离实现级别的使用方法:Java和C++等需要在实现层面对内存进行管理,而SQL则只需要告诉引擎用哪些表按照什么条件来查询。
  2. 我的观点是
    1. 要构建一个完全数据库独立的应用,而且是高度可扩展的应用是极其困难
    2. 实际上,这几乎是不可能
  3. 要构建一个完全数据库独立的应用
    1. 你必须真正了解每个数据库具体如何工作
    2. 如果你清楚每个数据库工作的具体细节,你就会知道,数据库独立性可能并不是你真正想要的:避免死锁的存在,Oracle中需要用for update来实现串行化。

4.2. 例如:Null值造成的数据库迁移障碍

  1. 例子:在表T中,如果不满足某个条件,则找出X为NULL的所有行,如果满足就找出X等于某个特定值的所有行
    1. Oracle并没有返回NULL(不知道)的所有行
    2. Oracle中NULL == NULL 返回 NULL

  1. 那么我们使用了is null关键字,但是Oracle不会为空值建立聚簇索引,导致性能会大幅度下降
  2. 于是我们通过创建了一个基于函数的索引来解决这个问题。

4.3. 关于黑盒的问题总结几点

  1. 数据库是不同的。在一个数据库上取得的经验也许可以部分应用于另一个数据库,但是必须有心理准备,二者之间可能存在一些基本差别,可能还有一些细微的差别。
  2. 细微的差别(比如对NULL的处理)与基本差别(如并发控制机制)可能有同样显著的影响。
  3. 应当了解数据库,知道它是如何工作的,他的特性如何实现,这是解决这些问题的唯一途径。

4.4. 思考题

  1. 关于把数据库当成黑盒使用的错误,其实也会在你学习软件开发中遇到类似的问题,比如,对操作系统的黑盒化,比如对某些开发框架的黑盒化等等,请你思考一下,你的学习过程中,还能找到类似的例子嘛?

5. 设计的问题

5.1. 我能不能找一个大牛帮我调优

  1. 先把程序写出来,之后再让专家在生产环境中帮我调优这个想法是错误的
  2. 性能调优(目前情况下性能优化至最优)
    1. 根据当前CPU能力、可用内存、I/O子系统等资源情况来设置相应参数:DBA在做,性能提高20-30%
    2. 通过索引、物理结构、SQL的优化,具体提高某一个查询的性能
  3. 如果有个专家能通过一些参数、技巧提高了你的系统一个数量级的性能:不能说这个专家牛逼,大概只能说明你的程序太烂了。

5.2. 性能拙劣的罪魁祸首是错误设计

设计决定了性能的级别,其他任何调优只是在这个级别内进行调整

  1. 提高整体性能
    1. 技巧决定系统性能的下限
    2. 设计决定系统性能的上限
  2. 比如,新闻的门户网站
    1. 动态页面 vs 静态页面:百万量级的高并发下的动态网页导致大量的连接创建、I/O资源、CPU资源被消耗,导致负担过重。
    2. 静态页面 + 内容管理系统:这个管理系统远远复杂于动态页面,使用触发器等自动化部署手段来生成静态网页
  3. 为什么微信不支持信息的修改?
    1. 因为微信朋友圈后台使用的NoSQL的非关系型数据库,所有的数据都是顺序存储,才能满足大量的读写效率。
    2. 顺序文件的修改是非常麻烦的,因此也就不支持了。

5.3. 性能优化要考虑整体

  1. 性能指标都是有成本的、安全和优化中寻找平衡
  2. 性能指标以吞吐量为核心(每秒处理多少事务),而尽量不用一个事务几秒能处理完成
  3. 性能指标要考虑整体性
    1. 优化手段本身是有风险的,只不过潜在的风险可能没有被意识到罢了
    2. 任何一个技术可以解决一个问题,但必然存在另一个问题的风险
    3. 对于带来的风险,控制在可接受的范围才是有成果
    4. 性能优化技术,使得性能变好,维持和变差是等概率的事件
    5. 局部最优和全局最优的区别

5.4. 使用优化工具

建议都尝试一下

5.5. 整体层面的性能优化考虑

  1. 问题一: CPU负载高, IO负载低
    1. 内存不够
    2. 磁盘性能差(磁盘问题、raid设计不好、 raid降级)
    3. SQL的问题
    4. 并发锁机制的问题
    5. 事务设计问题,大量小数据IO
    6. 大量的全表扫描
  2. 问题二:IO负载高,CPU负载低
    1. 大量小的IO执行写操作
    2. Autocommit,产生大量小IO
    3. 大量大的IO执行写操作
    4. SQL的问题
    5. IO/PS磁盘限定一个每秒最大IO次数
  3. 问题三: IO和CPU负载都高
    1. 硬件不够用了
    2. SQL存在问题
    3. 性能问题,90%的问题来源都是程序员的问题
    4. 开发环境到生产环境是一场灾难

5.6. SQL优化的方向

5.7. 思考

  1. 你对你常用的关系数据库关系系统中,去寻找一些针对优化的工具,去尝试使用一些性能的分析和监控工具(查看数据库官方Reference,首先使用官方的命令和工具)

http://chatgpt.dhexx.cn/article/ekpLKI6u.shtml

相关文章

数据库开发(Sqlite)

1、数据库开发 1.1 数据与数据管理 什么是信息&#xff1f;   信息是指对现实世界存在方式或运动状态的反应。 什么是数据&#xff1f;   数据是指存储在某一媒体上&#xff0c;能够被识别的物理符号&#xff1b;   数据的概念在数据处理领域已经被大为拓宽&#xff0c…

《软件测试的艺术》第4章:测试用例的设计-白盒测试

写在前面&#xff1a;原书中包含白盒测试、黑盒测试、错误猜测、测试策略四个小节&#xff0c;涵盖内容较多&#xff0c;因此按章节拆分叙述。 《软件测试的艺术》&#xff1a; 白盒测试--语句覆盖 语句覆盖的用例设计原则&#xff1a;将程序中的每条语句至少执行一次。 白盒…

《软件测试的艺术》读后感 Or 读书笔记

《软件测试的艺术》读后感 Or 读书笔记 第一章 一次自评价测试第二章 软件测试的心理学和经济学第三章 代码检查、走查与评审第四章 测试用例的设计第五章 模块&#xff08;单元&#xff09;测试第六章 更高级别的测试第七章 可用性&#xff08;或用户体验&#xff09;测试第八…

软件测试的艺术 学习笔记

文章目录 4.2黑盒测试4.2.1 等价划分4.2.2 边界值分析4.2.3 因果图 4.3 错误猜测4.4 测试策略 5. 模块(单元&#xff09;测试5.1 测试用例设计5.2 增量测试5.3 自顶向下测试与自底向上测试5.3.1 自顶向下的测试5.3.2 自底向上的测试5.3.3 比较 5.4 执行测试 6 更高级别的测试6.…

《软件测试的艺术》第六章 更高级别的测试

《软件测试的艺术》第六章 更高级别的测试 6.0 前言软件开发过程模型 6.1 功能测试6.2 系统测试6.2.1 能力测试6.2.2 容量测试6.2.3 强度测试6.2.4 可用性测试6.2.5 安全性测试6.2.6 性能测试6.2.7 存储测试6.2.8 配置设置6.2.9 兼容性/转换测试6.2.10 安装测试6.2.11 可靠性测…

模块测试(单元测试)——软件测试的艺术

是大型程序测试的第一个步骤【大型程序即超过500条语句的程序】 了解 模块测试是对程序中的单个程序、子程序/过程进行测试的过程【并非对整个程序】&#xff1a; 关注点在较小单元&#xff0c;是一种管理组合的测试元素的手段减轻调试的难度&#xff0c;把错误定位到一个小…

《软件测试的艺术》第1章:一次自评价测试

写在前面&#xff1a; 相比于芯片验证&#xff0c;软件测试有着悠久的历史沉淀和更为完整的生态&#xff0c;和芯片验证在某些方面上几乎有着相同的思路和方法。因此从软件测试的视角出发&#xff0c;重新思考芯片验证的方方面面。第一个系列为《软件测试的艺术》学习。 第一…

9年测试老鸟:Glenford J编写《软件测试的艺术》PDF,高清中文版

内容简介 本书以一次自评价测试开篇&#xff0c;从软件测试的心理学和经济学人手&#xff0c;探讨了代码检查、走查与评审、测试用例的设计、模块(单元)测试、系统测试、调试等主题&#xff0c;以及极限测试、因特网应用系统测试等高级主题&#xff0c;全面展现了作者的软件测…

系统测试——软件测试的艺术

系统测试有着特定的目的&#xff1a;将系统或程序与其初始目标进行比较&#xff0c;给定目标后有两含义&#xff1a; 系统测试不局限于系统&#xff0c;若产品是一个程序&#xff1a;系统测试就是试图说明程序作为一个整体是如何不满足其目标的过程根据定义&#xff0c;若产品…

《软件测试的艺术》重点记录

----定义---- 测试是为发现错误而执行程序的过程。 测试提高了程序的可靠性或质量。 ----测试方法---- 黑盒测试&#xff1a;又称之为数据驱动的测试或输入/输出驱动的测试。 白盒测试&#xff1a;对程序的逻辑结构进行检查&#xff0c;从中获取测试数据。 ----测试的原则…

软件测试的艺术(测试工程师必备基本知识与概念)

目录&#xff1a; 一、黑盒测试与白盒测试&#xff1a; 等价类划分&#xff1a; 一、确定等价类 确定等价类是选取每一个输入条件&#xff08;通常是规格说明中的一个句子或短语&#xff09;并 将其划分为两个或更多的组。可以使用图 4-3 中的表格来进行划分。注意&#xff0…

《软件测试的艺术》第五章 模块(单元)测试

目录 5.0 前言 5.1 测试用例设计 5.2 增量测试 5.3 自顶向下测试和自底向上测试 5.4 执行测试 5.5 小结 5.0 前言 大型的软件程序需要特别的测试对策。在本章中我们会探讨构建大型程序测试的第一个步骤&#xff1a;模块测试&#xff08;单元测试&#xff09;&#xff0c…

软件测试的艺术_读书笔记(一)

软件测试的艺术是测试人员必看书&#xff0c;两年前看这本书给我很多理论和指导&#xff0c;现在重新看&#xff0c;按照个人的理解&#xff0c;整理一些学习笔记。 第一章 软件测试的心理学和经济学 最重要的一句话 &#xff1a; 测试人员的态度比实际测试过程本身更重要 1.…

【读书笔记】-《软件测试的艺术》

2018年10月13日23:24:26 自诩&#xff1a; 因为上一东家工作的原因而接触测试。原本本职是嵌入式软件&#xff0c;因为公司正在风口浪尖的阶段&#xff0c;就是一种小公司要发展成为大公司而经历的那种痛&#xff0c;全公司上下都忙得焦头烂额的这样的背景下&#xff0c;我从软…

《软件测试的艺术》第2章:软件测试的心理学和经济学

软件测试的心理学 书中此部分首先辨析了两个概念&#xff1a;软件测试的定义、成功的测试和不成功的测试。 软件测试的定义&#xff1a; 测试是为发现错误而执行程序的过程&#xff0c;我们应当假设程序是存在bug的&#xff1b;由于证明程序不存在错误的过程是一项看起来不…

《软件测试的艺术》读书笔记

1 一次自评价测试 所谓软件测试&#xff0c;就是一个过程或一系列过程&#xff0c;用来确认计算机代码完成了其应该完成的功能&#xff0c;不执行其不该执行的功能。 2 软件测试的心理学和经济学 2.1 软件测试的心理学 软件测试是为发现错误而执行程序的过程。 2.2 软…

精读-软件测试的艺术之模块测试及更高级别的测试

本文是关于精读书籍《软件测试的艺术》的一些学习笔记和分享 本书共有九章包括测试思想&#xff08;心理&#xff0c;经济&#xff09;&#xff0c;代码检查&#xff0c;测试用例设计&#xff0c;模块测试&#xff0c;更高级别的测试&#xff0c;调试&#xff0c;极限测试和因…

软件测试,浅析这项黑色艺术的难与易

今天给各位同行们带来一本技术好书《软件测试的艺术》&#xff08;原书第3版&#xff09;&#xff0c;让我们一起来赏析这本经典著作吧&#xff01; 本书是国内很多软件测试书籍的首要参考书目&#xff0c;短小精悍的篇幅、深入浅出的内容很适合初学者作为入门首选。同时&…

软件测试执行的艺术

测试执行 测试执行过程 主要任务 确定测试用例的优先级开发测试规程并确定优先级&#xff0c;创建测试数据&#xff0c;同时也可以准备测试用例和设计自动化测试脚本根据测试规程创建测试套件&#xff0c;以提高测试执行的效率确认已经正确搭建的测试环境根据计划的执行顺序&…

《软件测试的艺术》万字笔记

软件测试的心理学和经济学 软件测试人员在测试过程中要有正确的态度&#xff08;愿景&#xff09; 心理学 软件测试的定义需要明确&#xff1a;软件测试的根本应该聚焦到为程序增加价值&#xff0c;让程序变得更加可靠&#xff0c;是找出问题并让问题得到解决的过程 测试是…