还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据库编程教程欢迎参加数据库编程教程!在这个全面的课程中,我们将带您从数据库基础知识一直深入到高级应用,帮助您掌握数据库编程的核心概念和实用技能无论您是初学者还是有一定经验的开发人员,这个课程都能为您提供宝贵的知识和实践经验我们将探索各种数据库类型,深入研究SQL语言,学习数据库设计原则,以及如何将数据库与各种编程语言集成通过实际案例和动手实践,确保您不仅理解理论知识,还能够在实际工作中应用这些技能课程简介课程目标掌握数据库基础概念和SQL语言理解数据库设计原则和最佳实践学习如何优化查询性能和管理事务学习路径从数据库基础开始,逐步进入SQL编程探索高级主题,如存储过程和触发器实践数据库与不同编程语言的集成目标学员软件开发工程师需要理解数据操作原理数据分析师希望提升SQL查询技能数据库管理员需要全面掌握数据库知识本课程设计为循序渐进的学习体验,从基础概念开始,逐步深入到复杂的数据库操作和优化技术我们的目标是确保所有学员,无论背景如何,都能获得实用的数据库技能,并能在实际工作环境中应用这些知识什么是数据库数据库定义数据库作用数据库是一个有组织的数据集合,通常以电子形式存储在计数据库在现代信息系统中扮演着核心角色,用于存储和管理算机系统中数据库由数据库管理系统DBMS控制,各种类型的信息,从简单的文本记录到复杂的多媒体内容DBMS提供了存储、检索、管理和操作数据的机制它们为组织提供了一种有效管理大量数据的方式数据库通过提供结构化存储,确保数据的完整性、安全性和主要作用包括确保数据一致性,支持多用户并发访问,提一致性,同时允许多个用户并发访问和操作数据供数据独立性,以及通过备份和恢复功能保护数据免受损失从银行交易记录、医院患者信息,到社交媒体内容和在线购物平台的产品目录,数据库无处不在,它们构成了现代社会信息基础设施的核心组成部分数据库发展历史早期文件系统(1960年代早期)最初数据以平面文件形式存储,缺乏结构和关系用户需要了解物理存储位置才能访问数据网络和层次数据库(1960年代中期)如IBM的IMS系统,采用树形结构组织数据,关系由物理指针表示这些系统较为复杂且缺乏灵活性关系型数据库(1970年代)由E.F.Codd提出关系模型,数据以表格形式组织,通过共享字段建立关系SQL语言开发,大幅简化了数据操作非关系型数据库(2000年代)为处理大数据和非结构化数据而兴起,包括文档型、键值对、图形数据库等多种类型,提供了更高的灵活性和扩展性数据库技术的发展反映了计算需求的变化和存储技术的进步从最初的文件系统到现代的分布式数据库,每一阶段都解决了前一阶段存在的限制,同时为下一代技术奠定了基础常见数据库类型关系型数据库非关系型数据库基于关系模型,使用表、行、列结构存储数据不使用传统表结构,针对特定数据模型优化•MySQL开源,适合Web应用,易于使用•MongoDB文档型,适合层次化数据•PostgreSQL功能强大,支持高级数据类•Redis键值存储,高性能缓存型•Neo4j图数据库,适合关系分析•Oracle企业级解决方案,高可靠性•Cassandra列式存储,适合大规模分布•SQL Server微软产品,与Windows环式数据境集成良好特定用途数据库为解决特定领域问题而设计•时间序列数据库如InfluxDB,针对时间戳数据•搜索引擎数据库如Elasticsearch,提供全文检索•内存数据库如Redis和MemSQL,数据存储在内存中选择何种类型的数据库取决于应用需求、数据特性、预期负载和开发团队熟悉程度现代应用常采用多数据库策略,利用不同类型的数据库处理不同类型的数据和查询关系型数据库简介结构化数据存储方式核心概念关系型数据库基于E.F.Codd提出的关系模型,将数据组织成•表(Table)数据的基本存储单位,由行和列构成具有行和列的二维表格每个表代表一个实体类型,表中的•行(Row)也称为记录,表示一个数据实体每一行是该实体的一个实例,而列则表示实体的属性•列(Column)表示数据属性,有特定的数据类型•主键(Primary Key)唯一标识表中每一行的列或列组这种结构化的方式使数据易于理解、查询和操作,同时通过合表之间的关系实现了复杂数据之间的连接关系通常通过键•外键(Foreign Key)建立表之间关系的列,引用另一(特别是主键和外键)来建立和维护表的主键•约束(Constraint)确保数据完整性的规则关系型数据库的强大之处在于其能够通过结构化查询语言(SQL)对数据进行高效的管理和操作,同时通过约束机制确保数据的完整性和一致性这种数据库类型已经成功应用于各行各业数十年,证明了其设计的稳健性和适应性数据库架构与组成数据库服务器物理或虚拟硬件,运行数据库系统数据库实例运行的DBMS软件及其分配的内存结构数据库相关数据的有组织集合,包含多个表表、索引、视图等对象存储和访问数据的结构数据库服务器是整个架构的基础,它提供了运行数据库系统所需的计算资源数据库实例是运行中的DBMS程序,它管理着内存结构、后台进程和用户连接一个实例可以管理多个数据库,每个数据库包含多个对象,如表、索引和视图除了基本的表结构外,现代数据库系统还包含许多高级组件,如存储过程(预编译的SQL语句集合)、触发器(在特定事件发生时自动执行的代码)和事务日志(记录数据库更改的日志文件)这些组件共同工作,确保数据库系统的高效、可靠和安全运行数据模型基础概念模型最抽象的层次,描述实体和它们之间的关系,与具体实现无关主要工具是实体-关系图ER图,用于展示实体、属性和关系逻辑模型基于概念模型,但更接近实际数据库实现将ER图转换为表结构,定义键和关系,但不涉及特定DBMS物理模型最具体的层次,针对特定DBMS实现包括表、列的具体数据类型、索引设计和存储考虑实体-关系模型ER模型是最常用的数据建模工具,由Peter Chen在1976年提出它使用简单的图形符号表示复杂的数据关系,帮助设计者和用户理解数据结构ER模型识别实体(现实世界的对象)、属性(实体的特性)和关系(实体之间的联系)良好的数据建模是成功数据库设计的基础通过先创建概念模型,再逐步细化为逻辑模型和物理模型,可以确保数据库设计满足业务需求,同时在技术上可行且高效这种自上而下的方法有助于识别潜在问题并在早期阶段解决,避免后期昂贵的重构实体与属性实体定义属性类型实体是现实世界中可区分的对象,在数据库•简单属性不可再分的单一值,如年龄中通常表示为表实体可以是有形的(如学•复合属性可分解为更小单位,如地址生、产品)或无形的(如课程、订单)•单值属性对特定实体只有一个值,如实体类型是具有相同属性的实体集合,而实身份证号体实例则是该类型的具体例子例如,学生•多值属性可有多个值,如电话号码是一个实体类型,而学号为101的张三是一•派生属性可从其他属性计算得出,如个实体实例年龄可从出生日期计算主键与唯一标识主键是唯一标识实体的属性或属性组合一个好的主键应该唯
一、不变、非空、尽量简单自然主键来自实体的固有属性,如身份证号;代理主键则是人为创建的,如自增ID代理主键通常更稳定,而自然主键可能更有业务含义在设计数据库时,识别正确的实体和属性是基础工作应确保每个实体明确定义,属性完整描述实体特征,并选择适当的主键这样的设计将确保数据库能够准确反映现实世界的业务规则和关系关系及其类别一对一关系1:1一个实体实例只与另一个实体的一个实例相关联例如,一个人与一个身份证号码相关联这种关系通常通过在一个表中包含另一个表的主键作为外键来实现例如一个员工只有一个详细档案,一个详细档案只属于一个员工一对多关系1:N一个实体实例可与另一个实体的多个实例相关联,但反过来,后者的每个实例只能与前者的一个实例相关联这是最常见的关系类型例如一个部门有多名员工,但一名员工只属于一个部门多对多关系M:N一个实体的多个实例可与另一个实体的多个实例相关联这种关系通常需要一个中间表(关联表)来实现例如一个学生可以选修多门课程,一门课程可以被多个学生选修在实际数据库设计中,理解和正确建模这些关系至关重要一对一关系可以用于分离频繁访问的数据和不常访问的数据,一对多关系是最自然的父子关系表示,而多对多关系则需要通过引入关联表来分解成两个一对多关系选择正确的关系类型将直接影响数据的完整性、查询效率和扩展性关系的实现通常通过外键约束来确保数据一致性,防止出现孤立的记录或无效的引用语言简介SQLSQL历史与标准SQL语句分类SQL(结构化查询语言)最初由IBM研究实验室在1970年代开•数据定义语言(DDL)用于定义数据库结构,如发,原名SEQUEL(Structured EnglishQuery Language)CREATE、ALTER、DROP1986年,SQL被美国国家标准协会(ANSI)标准化,后来又被•数据操作语言(DML)用于操作数据,如SELECT、国际标准化组织(ISO)采纳INSERT、UPDATE、DELETE尽管存在标准,各数据库厂商的SQL实现仍有差异,这导致了方•数据控制语言(DCL)用于控制访问权限,如GRANT、言的产生,如T-SQL(SQL Server)和PL/SQL(Oracle)REVOKE•事务控制语言(TCL)用于管理事务,如COMMIT、ROLLBACKSQL的强大之处在于它结合了数据定义、操作和查询功能于一体,使用声明式语法描述做什么而非怎么做这使得SQL易于学习,同时也为数据库系统留下了优化查询执行计划的空间虽然随着NoSQL数据库的兴起,出现了许多替代查询语言,但SQL仍然是业界标准,几乎所有数据专业人士都需要掌握即使在使用NoSQL系统的环境中,SQL知识也常常是必要的,因为许多NoSQL数据库也开始支持SQL类似的查询功能数据定义语言DDL数据定义语言(DDL)是SQL的一个子集,用于定义和管理数据库对象的结构主要的DDL语句包括CREATE(创建新对象)、ALTER(修改现有对象)和DROP(删除对象)使用CREATE TABLE语句,我们可以定义表结构,包括列名、数据类型、约束条件等例如,创建一个学生表CREATE TABLE学生学号CHAR10PRIMARY KEY,姓名VARCHAR20NOT NULL,年龄INT,班级VARCHAR10;使用ALTER TABLE语句,我们可以修改现有表的结构,如添加新列、修改列定义、添加或删除约束等例如,向学生表添加一个性别列ALTER TABLE学生ADD性别CHAR1;而DROP TABLE语句则用于删除表及其所有数据DROP TABLE学生;数据操作语言DMLSELECT语句INSERT语句用于从数据库中检索数据,是最常用的SQL语句可以指定列、设置条用于向表中添加新记录有两种形式指定列名和不指定列名例如件、排序和分组例如SELECT姓名,年龄FROM学生WHERE班级=INSERT INTO学生学号,姓名,年龄VALUES2023001,张三,20;计算机1班ORDER BY年龄;UPDATE语句DELETE语句用于修改表中的现有数据可以更新一个或多个列,并可以设置条件只更用于删除表中的行如果不指定WHERE子句,会删除表中所有数据例新特定行例如UPDATE学生SET年龄=21WHERE学号=2023001;如DELETE FROM学生WHERE学号=2023001;DML语句直接操作数据库中的数据,而不是数据库结构在实际应用中,应谨慎使用UPDATE和DELETE语句,特别是当不带WHERE子句时,因为这可能导致大量数据被意外修改或删除建议先使用SELECT测试WHERE条件,确认影响的行符合预期,然后再执行更新或删除操作数据控制语言DCL权限管理基础GRANT语句REVOKE语句数据控制语言(DCL)主要用于管理数据GRANT语句用于给用户授予特定的权限REVOKE语句用于撤销先前授予的权限库的安全性,控制用户对数据库对象的访基本语法为基本语法为问权限在多用户环境中,适当的权限管GRANT权限类型ON对象TO用户;REVOKE权限类型ON对象FROM用户;理对于保护数据安全至关重要例如,授予用户张三对学生表的查询权例如,撤销用户张三对学生表的更新权DCL的主要语句包括GRANT(授予权限)限限和REVOKE(撤销权限)通过这些语句,数据库管理员可以精确控制每个用户GRANT SELECTON学生TO张三;REVOKE UPDATE ON学生FROM张三;或角色对数据库对象的访问级别可以同时授予多种权限GRANT SELECT,INSERT,UPDATEON学生TO张三;在实际应用中,通常采用角色(Role)来简化权限管理首先创建角色并为角色分配权限,然后将用户分配给相应角色这样,当需要修改权限时,只需更改角色的权限设置,而不必逐一调整每个用户的权限查询语法详解SQLSELECT语句基本结构WHERE条件筛选SELECT语句是SQL中最常用、功能最强大的语句,WHERE子句用于筛选满足特定条件的行可以使用于从一个或多个表中检索数据一个完整的用各种运算符SELECT语句可以包含多个子句•比较运算符=,,,=,=,•SELECT指定要检索的列•逻辑运算符AND,OR,NOT•FROM指定数据来源的表•范围BETWEEN...AND...•WHERE设置行筛选条件•列表IN值1,值2,...•GROUP BY根据指定列分组•模式匹配LIKE模式•HAVING设置组筛选条件•空值检查IS NULL,IS NOT NULL•ORDER BY指定结果排序方式常见查询示例•基本查询SELECT姓名,年龄FROM学生;•条件查询SELECT*FROM学生WHERE年龄20;•AND组合SELECT*FROM学生WHERE年龄20AND班级=计算机1班;•IN操作SELECT*FROM学生WHERE班级IN计算机1班,计算机2班;•模糊查询SELECT*FROM学生WHERE姓名LIKE张%;SQL查询的执行顺序与编写顺序不同实际执行顺序通常是FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY了解这一点对于编写复杂查询和理解查询性能非常重要排序与分组ORDER BY排序GROUP BY分组ORDER BY子句用于对查询结果进行排序,可以按一个或多个列进行升序GROUP BY子句用于将查询结果按一个或多个列分组,通常与聚合函数一或降序排列默认为升序ASC,可以明确指定降序DESC起使用,对每个分组执行计算基本语法基本语法SELECT列名FROM表名ORDER BY列1[ASC|DESC],列2[ASC|DESC],...;SELECT列名,聚合函数FROM表名GROUP BY列名;示例示例SELECT姓名,年龄,成绩FROM学生ORDER BY成绩DESC;SELECT班级,COUNT*AS人数FROM学生GROUP BY班级;SELECT姓名,班级,成绩FROM学生ORDER BY班级ASC,成绩DESC;SELECT班级,AVG成绩AS平均分FROM学生GROUP BY班级;分组后可以使用HAVING子句对分组结果进行筛选SELECT班级,AVG成绩AS平均分FROM学生GROUP BY班级HAVING AVG成绩80;排序和分组是数据分析的基本操作排序使数据按照特定顺序呈现,便于观察数据的分布和趋势;分组则允许我们汇总数据,得到更高层次的洞察需要注意的是,WHERE筛选发生在分组前,而HAVING筛选发生在分组后,因此HAVING中可以使用聚合函数,而WHERE中不能聚合函数COUNT函数SUM函数计算行数或非NULL值的数量计算指定列的数值总和示例SELECT COUNT*FROM学生;--计算总行数示例SELECT SUM成绩FROM学生;--计算所有学生成绩总和示例SELECT COUNTemailFROM学生;--计算非NULL的email数量示例SELECT班级,SUM成绩FROM学生GROUP BY班级;--按班级计算成绩总和AVG函数MAX和MIN函数计算指定列的平均值分别查找指定列的最大值和最小值示例SELECT AVG成绩FROM学生;--计算所有学生平均成绩示例SELECT MAX成绩,MIN成绩FROM学生;--查找最高和最低成绩示例SELECT班级,AVG成绩FROM学生GROUP BY班级;--按班级计算平均成绩示例SELECT班级,MAX成绩AS最高分FROM学生GROUP BY班级;--按班级查找最高成绩聚合函数在数据分析中非常有用,它们可以对一组值执行计算并返回单个值这些函数通常与GROUP BY子句一起使用,对数据分组后进行汇总计算需要注意的是,除COUNT*外,所有聚合函数都会忽略NULL值SQL还提供了一些高级聚合功能,如窗口函数,它们允许在不分组的情况下执行聚合计算,为更复杂的数据分析提供了强大工具多表连接JOIN连接类型连接语法与示例•INNER JOIN内连接,只返回两表中匹配的行假设有学生表和班级表,通过班级ID关联•LEFT JOIN左外连接,返回左表所有行,右表不匹配则为NULLINNER JOIN示例•RIGHT JOIN右外连接,返回右表所有行,左表不匹配则为NULLSELECT学生.姓名,班级.班级名称•FULL JOIN全外连接,返回两表所有行,不匹配则为NULL•CROSS JOIN交叉连接,返回两表的笛卡尔积FROM学生INNER JOIN班级ON学生.班级ID=班级.ID;LEFT JOIN示例SELECT学生.姓名,班级.班级名称FROM学生LEFT JOIN班级ON学生.班级ID=班级.ID;连接操作是关系型数据库的核心功能,它允许我们基于共有的列将多个表中的相关数据组合在一起正确选择连接类型对于获取所需数据集至关重要例如,使用INNER JOIN只返回匹配的记录,而使用LEFT JOIN则可以保留左表的所有记录,即使它们在右表中没有匹配项在实际应用中,复杂查询可能涉及多个表的连接操作为提高查询效率,应确保连接条件使用索引列,并尽量减少连接表的数量此外,通过适当的表别名和列前缀,可以使查询更简洁、更易于理解子查询子查询概念子查询是嵌套在另一个查询中的SELECT语句,可以出现在SELECT、FROM、WHERE或HAVING子句中子查询返回的结果被外部查询使用,使SQL语句能够实现更复杂的逻辑子查询使用括号包围,可以独立执行根据返回结果的不同,子查询可分为标量子查询(返回单个值)、行子查询(返回单行多列)、表子查询(返回多行)单行子查询返回单个值的子查询,可以与比较运算符一起使用例如,查找成绩高于平均成绩的学生SELECT姓名,成绩FROM学生WHERE成绩SELECT AVG成绩FROM学生;多行子查询返回多个值的子查询,通常与IN、ANY、ALL等运算符一起使用例如,查找在计算机科学系的学生SELECT姓名FROM学生WHERE系部ID INSELECT IDFROM系部WHERE名称=计算机科学;相关子查询子查询引用了外部查询的列,因此外部查询的每一行都会导致子查询执行一次例如,查找每个班级中成绩最高的学生SELECT姓名,班级,成绩FROM学生s1WHERE成绩=SELECT MAX成绩FROM学生s2WHERE s
2.班级=s
1.班级;子查询是一种强大的SQL功能,允许我们执行复杂的数据操作和分析虽然许多子查询可以改写为连接操作,但子查询往往能更直观地表达查询意图在优化性能时,应注意子查询的执行效率,特别是相关子查询,因为它们可能导致查询执行多次视图与索引视图VIEW索引INDEX视图是基于一个或多个表的虚拟表,不存储实际数据,而是存储生成虚拟表的查索引是一种数据结构,用于加速数据库的查询操作索引通过创建指向表中数据的询视图可以简化复杂查询、提供额外的安全层,并支持向后兼容性指针,允许数据库更快地定位所需记录,类似于书籍的目录创建视图创建索引CREATE VIEW视图名AS SELECT语句;CREATE INDEX索引名ON表名列名1,列名2,...;例如,创建一个学生成绩视图例如,在学生表的姓名列上创建索引CREATE VIEW学生成绩视图AS CREATE INDEX idx_学生_姓名ON学生姓名;SELECT学生.姓名,课程.名称AS课程名,成绩.分数索引类型FROM学生JOIN成绩ON学生.ID=成绩.学生ID•B树索引最常见的索引类型,适用于大多数场景•哈希索引适用于等值查询,不支持范围查询JOIN课程ON成绩.课程ID=课程.ID;•全文索引用于文本搜索使用视图•空间索引用于地理数据SELECT*FROM学生成绩视图WHERE分数=90;视图和索引都是提高数据库使用效率的重要工具视图通过抽象和封装复杂查询逻辑,使数据访问更简单;索引则通过优化数据存储结构,使数据检索更快速然而,创建过多的索引可能导致插入和更新操作变慢,因此需要权衡查询性能和写入性能表的设计原则确保数据完整性遵循规范化原则使用主键唯一标识每条记录,使用外键维护表间关系,应用约束确保数据满足业务应用数据库规范化理论(1NF到3NF),减少数据冗余,避免插入、更新和删除异规则例如,设置NOT NULL约束防止关键字段缺失,使用CHECK约束验证数据范常每个表应代表一个实体或关系,每列应包含单一属性,避免重复组围考虑查询性能预留扩展空间在需要时进行适当的反规范化,为频繁查询的列创建适当的索引根据应用程序的选择适当的数据类型和长度,为未来可能的数据增长预留空间例如,使用读写模式权衡规范化和性能有时,计算列或冗余存储可以显著提高读取性能VARCHAR而非CHAR类型存储可变长度文本,避免过度限制字段长度而导致未来需要修改表结构良好的表设计是数据库成功的基础它不仅影响数据的完整性和一致性,还对应用程序的性能和可维护性有重大影响设计表时,应平衡业务需求、规范化原则和性能考虑,找到最适合特定应用场景的方案在实际应用中,往往需要根据具体情况做出权衡例如,高交易量的OLTP系统可能需要更规范化的设计以优化写操作,而数据仓库和OLAP系统则可能采用更多的反规范化设计以优化复杂查询性能数据库规范化第一范式1NF确保表中的每个单元格只包含单一值,且每一列都是原子的(不可再分)消除重复组和多值属性例如,不应在一个字段中存储多个电话号码,而应将它们分解为单独的记录或字段第二范式2NF在满足1NF的基础上,确保表中的每个非主键列完全依赖于整个主键,而不是主键的一部分这通常通过分解表来实现,尤其是当表有复合主键时目的是消除部分依赖第三范式3NF在满足2NF的基础上,确保表中的每个非主键列都直接依赖于主键,而不是依赖于其他非主键列目的是消除传递依赖,通常通过进一步分解表来实现BC范式BCNF在满足3NF的基础上,对于表中的任何函数依赖X→Y,X必须是超键(能唯一标识表中每一行的属性集)BCNF是3NF的更严格形式,进一步减少了冗余规范化是一个系统的过程,通过分解关系(表)来减少数据冗余并改善数据完整性它通过消除插入、更新和删除异常,使数据库设计更加健壮大多数实际应用通常遵循到第三范式就足够了,更高级的范式(如BCNF、4NF、5NF)在实践中较少使用然而,过度规范化可能导致查询性能下降,因为需要连接更多的表在某些情况下,为了性能考虑,可能会有意引入一些冗余(反规范化)数据库设计者需要在规范化的理论纯洁性和实际系统性能之间找到平衡点键与约束主键Primary Key外键Foreign Key唯一约束Unique其他约束唯一标识表中每一行的列或列组建立和维护表之间关系的列,它确保列或列组合的值在表中是唯•NOT NULL确保列不包含合,不允许NULL值一个表只能引用另一个表的主键外键确保一的,但允许NULL值(除非同时NULL值有一个主键主键通常是自然键参照完整性,防止创建无效的关指定NOT NULL)一个表可以•CHECK验证列值满足特定(业务数据中本来就存在的唯一系可以设置级联操作,如级联有多个唯一约束常用于候选条件标识)或代理键(人为创建的,删除或更新键,如电子邮件、身份证号等•DEFAULT为列指定默认值如自增ID)例如CREATE TABLE成绩ID例如CREATE TABLE用户ID例如CREATE TABLE员工ID例如CREATE TABLE学生学号INT PRIMARY KEY,学号INT,课INT PRIMARYKEY,邮箱INT PRIMARYKEY,年龄INTINT PRIMARYKEY,姓名程ID INT,分数FLOAT,FOREIGN VARCHAR100UNIQUE;CHECK年龄=18,入职日期VARCHAR50;KEY学号REFERENCES学生学DATE DEFAULT号;CURRENT_DATE;键和约束是数据库设计的关键元素,它们确保数据的完整性和一致性通过正确定义键和约束,我们可以防止错误数据进入系统,并维护表之间的正确关系在设计数据库时,应仔细考虑业务规则,并通过适当的约束将其编码到数据库结构中存储过程与函数存储过程定义与优势创建存储过程函数与存储过程的区别存储过程是保存在数据库中的一组SQL语句,可以接受参MySQL存储过程示例函数必须返回单一值,而存储过程可以返回多个值或不返数、执行操作并返回结果它们类似于其他编程语言中的回值函数可以在SQL语句中直接调用,而存储过程需要DELIMITER//函数或方法使用CALL语句CREATE PROCEDURE获取课程平均分IN课程名主要优势创建函数示例VARCHAR50,OUT平均分FLOAT•减少网络流量多条SQL语句只需一次网络往返CREATE FUNCTION计算总分学生ID INTRETURNSBEGINFLOAT•提高执行效率预编译和优化SELECT AVG成绩.分数INTO平均分•增强安全性可以控制对底层表的访问BEGIN•代码重用常用操作可封装为存储过程FROM成绩JOIN课程ON成绩.课程ID=课程.IDDECLARE总分FLOAT;•模块化和维护性业务逻辑集中在数据库层WHERE课程.名称=课程名;SELECT SUM分数INTO总分FROM成绩WHERE学生END//ID=学生ID;DELIMITER;RETURN总分;调用存储过程END;CALL获取课程平均分数据库,@平均分;使用函数SELECT@平均分;SELECT姓名,计算总分ID AS总分FROM学生;存储过程和函数是数据库编程的重要组成部分,它们允许在数据库层实现业务逻辑,提高应用性能和数据安全性在企业级应用中,复杂的数据处理逻辑常常通过存储过程实现,以确保数据完整性并提高处理效率触发器Triggers触发器定义触发类型触发器是一种特殊的存储过程,它在特定数据库事件发生时自动执行触发器不能被显式调用,而是•BEFORE触发器在DML操作前执行,可用于验证或修改将要插入或更新的数据由数据库系统自动激活,通常用于强制复杂的业务规则、审计数据变更或自动计算派生值•AFTER触发器在DML操作后执行,适用于审计、维护摘要表等操作•INSTEAD OF触发器替代原始操作,主要用于视图,使不可更新的视图可更新触发事件应用场景•INSERT插入新记录时触发•自动更新计算字段,如产品总价•UPDATE更新记录时触发•维护冗余数据一致性•DELETE删除记录时触发•实现复杂的数据验证规则触发器可以设置为响应一种或多种操作类型•创建数据审计跟踪•实现业务规则,如库存检查MySQL触发器示例创建一个在插入新订单后自动减少产品库存的触发器CREATE TRIGGER更新库存AFTER INSERT ON订单明细FOR EACHROWBEGINUPDATE产品SET库存量=库存量-NEW.数量WHERE产品.ID=NEW.产品ID;END;触发器是一种强大的工具,但应谨慎使用过多或设计不当的触发器可能导致性能问题或难以追踪的行为此外,复杂的触发器可能使数据库维护和调试变得困难事务管理基础开始事务执行操作使用BEGIN或START TRANSACTION语句标记事务开始执行一系列SQL语句,如INSERT、UPDATE、DELETE回滚事务提交事务使用ROLLBACK语句撤销所有更改(可选)使用COMMIT语句使所有更改永久生效事务是数据库操作的逻辑单位,要么完全执行,要么完全不执行事务具有ACID特性原子性Atomicity确保事务中的所有操作被视为一个整体;一致性Consistency确保事务将数据库从一个一致状态转换到另一个一致状态;隔离性Isolation确保事务的执行不受其他事务的干扰;持久性Durability确保事务一旦提交,其效果将永久保存事务处理示例转账操作,从账户A转移资金到账户B BEGIN;UPDATE账户SET余额=余额-1000WHERE账户ID=A;UPDATE账户SET余额=余额+1000WHERE账户ID=B;COMMIT;并发控制并发冲突类型锁机制乐观锁与悲观锁•丢失更新Lost Update两个事务更新同共享锁S锁允许多个事务同时读取数据,但悲观锁假设冲突会经常发生,在访问数据前一数据,后一个覆盖前一个阻止写入先加锁如SQL Server的SELECT...FORUPDATE•脏读Dirty Read读取到未提交的数据,排他锁X锁允许持有锁的事务读取和修改数如果对方回滚则读到无效数据据,阻止其他事务读取或写入乐观锁假设冲突很少发生,不加锁,而是在•不可重复读Non-repeatable Read同一更新时检查数据是否被修改通常使用版本号意向锁表示事务意图在表中的某些行上加共事务内多次读取同一数据得到不同结果或时间戳实现享或排他锁•幻读Phantom Read同一事务内执行相
1.读取数据及其版本号同查询返回不同的行集合锁粒度行级锁、页级锁、表级锁,粒度越细并发能力越高,但开销也越大
2.处理数据
3.更新时检查版本号是否变化
4.如无变化则更新成功,否则处理冲突(通常是重试或报错)并发控制是数据库管理系统的核心功能,它确保多用户环境下数据的一致性和完整性选择合适的并发控制策略需要考虑系统的并发需求、数据访问模式和业务容错性高并发系统通常采用细粒度锁或乐观并发控制,而对数据一致性要求极高的系统可能倾向于悲观锁定策略隔离级别Read Uncommitted(读未提交)最低隔离级别,允许脏读、不可重复读和幻读Read Committed(读已提交)防止脏读,但允许不可重复读和幻读Repeatable Read(可重复读)防止脏读和不可重复读,但可能允许幻读Serializable(串行化)最高隔离级别,防止所有并发问题SQL标准定义了四种事务隔离级别,从最低的Read Uncommitted到最高的Serializable隔离级别越高,数据一致性越好,但并发性能越低数据库系统通常允许设置默认隔离级别,也可以为特定事务指定不同的隔离级别MySQL中设置隔离级别SET TRANSACTIONISOLATION LEVELREPEATABLE READ;不同数据库系统对隔离级别的实现有所不同例如,MySQL的InnoDB在REPEATABLE READ级别使用MVCC技术,已经能有效防止大多数幻读情况PostgreSQL也有类似的行为选择合适的隔离级别应考虑应用对数据一致性的要求和系统性能目标的平衡死锁与防护死锁定义与示例死锁检测与解决死锁预防策略死锁是指两个或多个事务互相持有对方需要的数据库系统通常通过以下方式处理死锁•资源获取顺序始终以相同顺序获取锁,如锁,导致所有事务均无法继续执行的状态例先锁定ID较小的行死锁检测系统周期性检查是否存在等待环,如如•锁超时设置锁请求的超时时间,避免无限果存在则确认为死锁等待事务1死锁解决一旦检测到死锁,系统会选择一个或•减少锁范围只锁定必要的数据,尽快释放
1.获取资源A的锁多个事务作为牺牲者,将其回滚以打破死锁锁
2.尝试获取资源B的锁牺牲者选择通常基于最小成本原则,例如回滚执•减少事务大小将大事务拆分为多个小事务行时间较短或锁定资源较少的事务•使用合适的隔离级别避免不必要的高隔离事务2级别MySQL示例信息ERROR1213:Deadlock
1.获取资源B的锁found whentrying toget lock;try restarting•乐观并发控制在适当场景下使用乐观锁代替悲观锁
2.尝试获取资源A的锁transaction如果两个事务分别执行了第一步,则会形成循环等待,导致死锁死锁是并发数据库系统中的常见问题,尤其在高并发、复杂事务的环境中虽然数据库系统能够自动检测和解决死锁,但频繁的死锁会显著影响系统性能应用程序设计应尽量减少死锁发生的可能性,同时能够妥善处理死锁发生时的异常情况,通常是通过捕获异常并重试事务常见性能问题SQL慢查询现象全表扫描查询执行时间异常长,可能从几秒到几分钟甚至更长典型症状包括应用响应缓慢、当查询没有使用索引时,数据库必须检查表中的每一行,这在大表上极其低效全表系统资源占用高、数据库服务器负载增加慢查询不仅影响单个用户体验,还会导致扫描可能由复杂查询条件、函数应用于索引列、不当的统计信息或索引缺失等原因导连接池耗尽、阻塞其他查询,甚至引发系统级性能问题致EXPLAIN结果中的table scan或full scan是明显信号索引失效原因连接操作效率低常见索引失效情况对索引列使用函数或计算(如SUBSTRINGname,1,3=abc);多表连接效率问题通常源自表连接顺序不佳;缺少适当的连接索引;连接列数据类使用不等于或LIKE%abc(左模糊匹配);在OR条件中部分列无索引;数据类型不型不匹配;笛卡尔积(缺少连接条件);表过大但只需少量数据大量表连接不仅增匹配(如字符串列与数字比较);统计信息过时导致优化器不选择索引加复杂性,也提高了优化难度监控和识别SQL性能问题的工具包括数据库慢查询日志,记录执行时间超过阈值的查询;性能分析工具,如MySQL的Performance Schema;查询执行计划分析(EXPLAIN);数据库监控工具,如Prometheus、Grafana等这些工具提供了查询执行统计、资源使用情况和潜在瓶颈的可视化定期审查应用中的SQL查询,使用数据库提供的工具分析性能,并在发现问题时及时优化,是保持系统高性能的关键实践查询优化方法使用EXPLAIN分析索引优化查询重写EXPLAIN命令显示优化器如何执行索引是最有效的查询优化手段,但优化SQL语句本身查询,包括访问类型、使用的索需要科学设计•减少SELECT*,只查询需要的引、扫描的行数等信息关注要•为WHERE、ORDER BY、列点JOIN条件创建索引•避免子查询,尽量使用JOIN•type列system/const最好,•合理设计联合索引,遵循最左•拆分复杂查询为多个简单查询ALL全表扫描最差前缀原则•使用LIMIT限制结果集大小•rows列估计扫描的行数,•控制索引数量,索引太多会影•适当使用存储过程或视图封装越少越好响写入性能复杂逻辑•Extra列Using•定期分析索引使用情况,移除filesort/Using temporary通未使用的索引常是性能警告数据库配置优化调整数据库参数提升性能•增加缓冲池大小innodb_buffer_pool_size•优化排序缓冲区sort_buffer_size•调整连接池参数•配置适当的并发连接数查询优化是一个迭代过程,应先识别最慢的查询(通过慢查询日志),分析执行计划查找瓶颈,然后尝试不同的优化策略并测量效果优化应以实际性能提升为导向,避免过度优化记住,查询优化不仅关乎SQL语句本身,还涉及表结构设计、索引策略、数据库配置等多个方面索引优化技巧索引类型及原理联合索引策略B+树索引最常用的索引类型,数据按顺序存储,适合范围查询特点是高度平衡、分支因子大,即使数遵循最左前缀原则如创建索引A,B,C,可用于查询A、AB、ABC,但不适用于只查询B或C据量大也只需少量磁盘访问考虑列基数高基数(唯一值多)的列放前面,如姓名,性别比性别,姓名更有效哈希索引基于哈希表实现,只适合等值查询,不支持排序和范围查询优点是查找速度极快,常用于内考虑查询频率常用于WHERE条件的列放前面存数据库适当冗余有时创建多个重叠索引,如A,B和A,C,可能比单个A,B,C更有效全文索引专为文本搜索优化,支持关键词匹配、相关性排序等功能空间索引用于地理空间数据,支持位置、距离查询覆盖索引利用避免索引失效覆盖索引查询所需的所有列都在索引中,使优化器可直接从索引获取数据,无需回表不在索引列上使用函数错误示例WHERE YEAR生日=1990,改为WHERE生日BETWEEN1990-01-01AND1990-12-31实现方法在CREATEINDEX语句中包含所有需要查询的列避免隐式类型转换确保条件两边数据类型一致EXPLAIN中Using index表示使用了覆盖索引避免负向查询NOT IN,NOT LIKE通常导致全表扫描例如对于常查询SELECT姓名,年龄FROM学生WHERE班级=一班,可创建索引班级,姓名,年龄注意OR条件使用OR时所有条件都必须有索引,否则可能全表扫描索引是数据库性能优化的核心,但不是越多越好过多索引会增加维护成本,降低写入性能应定期使用数据库提供的工具(如MySQL的Index Statistics)分析索引使用情况,删除冗余或未使用的索引优化索引是权衡查询速度与更新速度、存储空间的过程,需要根据实际应用场景进行调整数据库备份与恢复备份类型备份工具与方法恢复操作•完全备份整个数据库的完整拷贝MySQL:恢复前的准备•增量备份仅备份上次备份后发生变化的数据•mysqldump逻辑备份工具,生成SQL脚本•验证备份完整性•差异备份备份自上次完全备份以来的所有变•例如mysqldump-u root-p--all-•确保有足够的磁盘空间化databasesbackup.sql•停止或限制应用程序访问逻辑备份和物理备份的区别•XtraBackup物理在线备份工具,支持完全和恢复方法增量备份逻辑备份以SQL语句形式导出数据,便于跨版本•MySQL EnterpriseBackup官方商业备份解•MySQL逻辑备份恢复mysql-u root-p或平台恢复,但速度较慢决方案backup.sql物理备份直接复制数据文件,速度快,但通常只•时间点恢复结合备份和二进制日志,恢复到PostgreSQL:能在相同版本间恢复特定时间点•pg_dump逻辑备份单个数据库•表级恢复只恢复特定的表•pg_dumpall备份整个数据库集群恢复验证恢复后检查数据一致性和完整性•物理备份通过文件系统快照或复制数据目录实现有效的备份策略通常结合完全备份和增量/差异备份,并遵循3-2-1原则至少3份备份,存储在2种不同的媒介上,其中1份存储在异地备份不仅要定期执行,还应定期测试恢复过程,确保在实际需要时能够顺利恢复此外,备份策略应与业务连续性需求相匹配,考虑恢复时间目标RTO和恢复点目标RPO数据库安全与权限管理网络与物理安全防火墙、VPN、加密传输用户认证与访问控制强密码策略、权限最小化原则数据加密与审计3敏感数据加密、操作日志记录应用层安全防SQL注入、输入验证数据库安全是多层次的防护体系,从物理安全到应用层安全用户与权限管理是其中关键部分,涉及创建用户账户、分配权限、实施角色管理等MySQL示例创建用户CREATE USERapp_user@localhost IDENTIFIEDBY password;授予权限GRANT SELECT,INSERTON database.*TO app_user@localhost;创建角色CREATE ROLEread_only;GRANT SELECTONdatabase.*TO read_only;分配角色GRANT read_only TOapp_user@localhost;SQL注入是常见的安全威胁,攻击者通过在输入中注入恶意SQL代码破坏查询逻辑防护措施包括使用参数化查询或预处理语句,而非字符串拼接;实施输入验证和转义;使用存储过程封装数据库操作;限制数据库用户权限,遵循最小权限原则主流数据库对比特性MySQL PostgreSQLOracle许可证GPL/商业PostgreSQL许可证开商业源性能高读取性能,适合OLTP读写均衡,复杂查询优全面优化,高端硬件上秀性能最佳可扩展性中等,主从复制良好,原生支持表分区极佳,RAC集群支持功能丰富度基本SQL功能完善高级特性丰富,如最全面的企业级功能JSON、全文搜索适用场景网站、中小型应用需要复杂查询的应用,大型企业应用,金融系GIS统开发者友好度简单易用,社区活跃标准遵循度高,文档详学习曲线陡峭,专业支尽持MySQL以其轻量、高性能的特点广受欢迎,尤其在Web应用中;PostgreSQL则因其强大的功能和稳定性受到专业开发者青睐;Oracle长期主导企业级市场,提供最全面的解决方案但价格昂贵选择数据库时应考虑项目规模和预期增长;数据类型和查询复杂度;开发团队技术储备;成本预算(许可、硬件、培训);可用性和扩展性需求;生态系统和工具支持实际项目中,可能采用多数据库策略,利用不同数据库的优势处理不同类型的数据和查询NoSQL数据库简介键值存储文档数据库列族存储特点极简的数据模型,每个键映射到一个值,特点存储半结构化文档(JSON、BSON等),特点按列而非行存储数据,适合大量写入和分无模式灵活模式析代表产品Redis、DynamoDB、Riak代表产品MongoDB、CouchDB、Firestore代表产品Cassandra、HBase、Google Bigtable适用场景缓存、会话存储、用户偏好设置、实适用场景内容管理、目录、用户配置文件、物时分析联网数据适用场景时间序列数据、日志存储、推荐系统优势极高的读写性能,易于扩展,简单的API优势灵活的数据模型,对开发者友好,良好的查询能力优势高吞吐量写入,优秀的可扩展性,适合大数据分析图数据库特点存储实体及其关系,优化关系遍历代表产品Neo4j、Amazon Neptune、JanusGraph适用场景社交网络、推荐引擎、知识图谱、欺诈检测优势高效的关系查询,直观的数据建模NoSQL(Not OnlySQL)数据库源于需要处理传统关系型数据库难以高效管理的大规模、高增长率和多样化数据的需求它们通常放弃ACID事务保证,采用BASE原则(基本可用、软状态、最终一致性),以获得更高的性能和可扩展性NoSQL数据库的选择应基于数据特性和应用需求例如,需要高速缓存可选择Redis;处理多变结构的文档可用MongoDB;需要处理海量时间序列数据可考虑Cassandra;分析复杂关系网络则适合Neo4j现代应用架构常采用多模式策略,结合关系型和NoSQL数据库的优势,形成更全面的数据解决方案MySQL基础实践安装与配置Windows安装下载MySQL Installer,选择合适的版本和组件(如Server、Workbench)进行安装安装过程中设置root密码,选择服务器配置类型(开发、生产等)Linux安装以Ubuntu为例,执行命令sudo aptupdatesudo aptinstall mysql-server安装后运行sudo mysql_secure_installation进行安全配置macOS安装可通过Homebrew安装brew installmysql,或下载DMG安装包创建数据库和用户连接MySQL mysql-u root-p创建数据库CREATE DATABASE学校管理系统CHARACTER SETutf8mb4COLLATE utf8mb4_unicode_ci;创建用户并授权CREATE USER管理员@localhost IDENTIFIEDBY密码;GRANT ALLPRIVILEGES ON学校管理系统.*TO管理员@localhost;查看数据库SHOW DATABASES;选择数据库USE学校管理系统;创建表创建学生表CREATE TABLE学生学号VARCHAR10PRIMARYKEY,姓名VARCHAR20NOT NULL,性别ENUM男,女NOTNULL,出生日期DATE,班级ID INT,FOREIGN KEY班级ID REFERENCES班级ID;查看表结构DESCRIBE学生;MySQL是最流行的开源关系型数据库之一,以其可靠性、易用性和性能著称在实践中,建议使用MySQL Workbench等图形工具简化管理操作,尤其是对初学者对于生产环境,应注意配置适当的字符集(推荐utf8mb4以支持完整Unicode)、存储引擎(通常InnoDB)和安全设置MySQL常用命令演示MySQL基本操作命令示例
1.数据操作插入数据INSERT INTO学生学号,姓名,性别,出生日期VALUES2023001,张三,男,2005-06-15;查询数据SELECT*FROM学生WHERE性别=男ORDER BY出生日期;更新数据UPDATE学生SET班级ID=2WHERE学号=2023001;删除数据DELETE FROM学生WHERE学号=2023001;
2.连接与字符集查看当前连接SHOW PROCESSLIST;查看字符集SHOW VARIABLESLIKE character_set%;设置字符集SET NAMESutf8mb4;
3.表管理特性用法PostgreSQL高级数据类型函数与过程PostgreSQL提供丰富的数据类型,包括数组、hstore键值对、JSON/JSONB、XML、几何PostgreSQL支持多种编程语言创建函数,包括SQL、PL/pgSQL、PL/Python、PL/Perl等类型、网络地址类型等例如,创建带JSON列的表CREATE TABLE产品ID SERIALPRIMARYKEY,属性JSONB;PL/pgSQL函数示例JSON操作SELECT属性-颜色AS颜色FROM产品WHERE属性@{品牌:华为};CREATE FUNCTION计算年龄出生日期DATE RETURNSINT AS$$BEGINRETURN EXTRACTYEARFROM AGECURRENT_DATE,出生日期;END;$$LANGUAGE plpgsql;扩展系统表继承与分区PostgreSQL的扩展系统允许添加新功能,如PostGIS地理信息、TimescaleDB时间序列、表继承允许创建父表和子表,子表继承父表结构表分区支持对大表进行水平拆分,提高查PG_STAT_STATEMENTS性能监控等询性能安装扩展CREATE EXTENSIONpostgis;创建分区表CREATE TABLE销售ID SERIAL,日期DATE,金额NUMERIC PARTITIONBYRANGE日期;使用地理功能SELECT ST_Distance地点::geography,ST_MakePoint
116.4,
39.9::geography FROM位置表;创建分区CREATE TABLE销售_2023PARTITION OF销售FOR VALUESFROM2023-01-01TO2024-01-01;PostgreSQL以其强大的功能和标准遵循性著称,特别适合需要复杂数据类型和高级查询功能的应用与MySQL相比,PostgreSQL通常提供更多的高级特性,但配置和优化可能更复杂对于地理信息系统、科学计算、大数据分析等应用,PostgreSQL往往是更好的选择PostgreSQL还提供了强大的全文搜索、复制功能和事务隔离级别选项,使其成为构建现代应用的理想平台使用pgAdmin或DBeaver等图形工具可简化管理操作快速入门MongoDBMongoDB基本概念CRUD操作MongoDB是一个文档型数据库,存储BSON(二进制JSON)格式的文档,具有灵活的模式其核创建Create操作心概念包括db.学生.insertOne{姓名:张三,年龄:20,爱好:[足球,篮球]};•数据库Database包含多个集合,类似SQL中的数据库db.学生.insertMany[{姓名:李四,年龄:22},{姓名:王五,年龄:21}];•集合Collection文档的分组,类似SQL中的表读取Read操作•文档Document一条记录,类似SQL中的行,但结构灵活•字段Field文档中的键值对,类似SQL中的列db.学生.find{年龄:{$gt:20}};//查找年龄大于20的学生•索引Index提高查询效率的数据结构db.学生.findOne{姓名:张三};//查找名为张三的第一个学生•ObjectId自动生成的唯一标识符,类似主键更新Update操作db.学生.updateOne{姓名:张三},{$set:{年龄:21}};//更新张三的年龄db.学生.updateMany{},{$inc:{年龄:1}};//所有学生年龄加1删除Delete操作db.学生.deleteOne{姓名:张三};//删除名为张三的第一个学生db.学生.deleteMany{年龄:{$lt:20}};//删除年龄小于20的所有学生MongoDB的优势在于其灵活的文档模型,允许存储嵌套数据,减少关联查询需求;支持动态模式,不同文档可以有不同的字段结构;具有良好的水平扩展能力,通过分片Sharding实现;提供丰富的查询语言,包括聚合管道、地理空间查询等适用场景包括内容管理系统,处理多变结构的内容;实时大数据应用,利用其高写入性能;物联网数据存储,适应多变的数据模式;开发原型和敏捷项目,快速迭代无需修改表结构与关系型数据库相比,MongoDB牺牲了部分ACID保证和连接功能,换取更高的灵活性和性能数据库与编程语言集成概述编程语言/应用数据库接口通过API发送请求,处理返回结果JDBC,ODBC,ORM等连接器4数据库数据库管理系统物理存储数据的位置处理查询,返回结果数据库与编程语言的集成通常通过以下接口实现
1.低级连接API-JDBCJava DatabaseConnectivity Java语言标准数据库接口,提供统一API访问不同数据库-ODBCOpen DatabaseConnectivity开放数据库连接标准,多种语言通用-原生驱动如Python的PyMySQL,pymongo,Node.js的mysql2,mongodb等
2.ORM对象关系映射-将数据库表映射为对象,简化数据操作-常见ORM Java的Hibernate/JPA,Python的SQLAlchemy/Django ORM,JavaScript的Sequelize/TypeORM数据库开发实例JavaJDBC连接基础预处理语句Java通过JDBCJava DatabaseConnectivity与数据库交互,需要导入相应驱动包MySQL连接示例使用PreparedStatement可防止SQL注入,提高性能•添加依赖Maven中添加mysql-connector-java•创建预处理语句•注册驱动Class.forNamecom.mysql.cj.jdbc.Driver;•PreparedStatement pstmt=conn.prepareStatementSELECT*FROM学生WHERE班级=;•建立连接Connection conn=DriverManager.getConnectionurl,username,password;•设置参数pstmt.setString1,计算机一班;•创建语句Statement stmt=conn.createStatement;•执行查询ResultSet rs=pstmt.executeQuery;•执行查询ResultSet rs=stmt.executeQuerySELECT*FROM学生;•处理结果whilers.next{...}•关闭资源rs.close;stmt.close;conn.close;事务管理JPA/Hibernate示例Java中的事务管理使用ORM简化数据库操作•关闭自动提交conn.setAutoCommitfalse;•实体类定义•执行多个操作...•@Entity@Tablename=学生•提交事务conn.commit;•public classStudent{@Id private String id;privateStringname;...}•发生异常时回滚conn.rollback;•使用EntityManager查询•finally块中恢复设置conn.setAutoCommittrue;•List students=em.createQuerySELECT sFROM Students.getResultList;•使用仓库模式Spring DataJPA•public interfaceStudentRepository extendsJpaRepository{}Java数据库开发中,推荐使用连接池管理数据库连接,如HikariCP、Tomcat JDBC、C3P0等连接池维护预先创建的连接集合,减少连接创建和销毁的开销,提高应用性能此外,应当使用try-with-resources语句自动关闭资源,避免资源泄漏Python数据库开发实例使用PyMySQL使用SQLAlchemyPyMySQL是Python访问MySQL的纯Python实现,安装简单,兼容性好基本使用SQLAlchemy是Python最流行的ORM库,提供高级抽象,支持多种数据库基本使用import pymysqlfrom sqlalchemyimport create_engine,Column,Integer,String,ForeignKeyconn=pymysql.connect from sqlalchemy.ext.declarative importdeclarative_basehost=localhost,fromsqlalchemy.orm importsessionmaker,relationshipuser=用户名,#创建连接password=密码,engine=create_enginemysql+pymysql://用户名:密码@localhost/学校管理系统database=学校管理系统,Base=declarative_basecharset=utf8mb4#定义模型class学生Base:try:__tablename__=学生with conn.cursor ascursor:学号=ColumnString10,primary_key=True#执行SQL查询姓名=ColumnString20,nullable=Falsecursor.executeSELECT姓名,年龄FROM学生WHERE班级=%s,计算机一班,年龄=ColumnInteger#获取结果班级ID=ColumnInteger,ForeignKey班级.IDresults=cursor.fetchall班级=relationship班级,back_populates=学生for rowin results:#创建会话printf姓名:{row
[0]},年龄:{row
[1]}Session=sessionmakerbind=engine#提交更改session=Sessionconn.commit#查询数据finally:students=session.query学生.filter学生.年龄
18.allconn.close forstudent instudents:printf姓名:{student.姓名},年龄:{student.年龄}session.close数据库调优工具MySQL性能监控工具MySQL自带的性能监控工具包括Performance Schema和sys模式,提供实时性能数据,可查询哪些SQL语句最消耗资源,哪些表最频繁访问第三方工具如PMMPercona Monitoringand Management提供图形化界面,直观显示性能瓶颈,还支持查询分析和建议慢查询日志分析MySQL慢查询日志记录执行时间超过设定阈值的SQL语句工具如pt-query-digest可分析慢查询日志,汇总相似查询,识别最消耗资源的SQL模式通过设置long_query_time参数调整记录阈值,log_queries_not_using_indexes可记录未使用索引的查询执行计划分析EXPLAIN命令显示查询执行计划,如连接方式、索引使用情况等可视化工具如MySQL Workbench提供图形化执行计划显示,更直观理解查询执行流程EXPLAIN ANALYZE(MySQL
8.0+)显示实际执行统计数据,而非估计值,帮助识别优化器估计与实际不符的情况索引与表结构分析工具如pt-duplicate-key-checker分析冗余索引,减少不必要的维护开销mysqltuner.pl脚本可分析表结构和配置,提供针对性优化建议sys模式下的schema_unused_indexes视图可识别未使用的索引,这些索引可能成为写操作瓶颈有效使用这些工具需要先建立基线,了解正常运行时的性能指标,以便识别异常调优不应是一次性活动,而应是持续过程,跟踪性能变化并适应业务需求变化在进行重大更改前,应在测试环境中验证效果,避免对生产系统造成意外影响许多云数据库服务提供内置监控和调优工具,如AWS RDSPerformance Insights、阿里云数据库性能监控等这些工具通常集成了告警系统,可在性能问题发生前提供预警,实现主动性能管理数据库迁移与升级准备阶段全面评估当前数据库状态,包括大小、架构复杂度、依赖关系和业务关键程度制定详细迁移计划,包括时间线、责任分工和回滚策略选择合适的迁移工具,如MySQL的mysqldump、mydumper或PostgreSQL的pg_dump建立测试环境验证迁移流程数据迁移阶段创建目标数据库架构,包括表、视图、存储过程等迁移数据可采用离线迁移(停机)或在线迁移(最小停机时间)策略大型数据库可考虑分批迁移或使用CDC(变更数据捕获)工具保持数据同步对迁移后的数据进行完整性和一致性验证切换阶段准备应用程序配置更改,指向新数据库计划维护窗口,通知相关用户执行最终数据同步,确保数据最新切换数据库连接,将应用程序指向新数据库验证应用程序功能正常,监控性能和错误率验证与清理全面测试应用功能,确保所有业务流程正常监控新数据库性能,识别并解决潜在问题进行数据审计,确保数据完整性根据策略保留旧数据库作为备份,直到确认迁移完全成功记录经验教训,完善未来迁移流程数据库升级面临的常见挑战包括不兼容的SQL语法变化,如函数名称变化或保留字新增;索引行为变化,可能影响查询计划;存储过程和触发器语法变化;性能特性变化,如优化器行为调整应仔细阅读新版本发布说明,识别潜在兼容性问题对于关键系统,应考虑采用蓝绿部署或金丝雀发布策略,降低升级风险蓝绿部署通过准备完全相同的新环境,切换流量实现升级;金丝雀发布则将少量流量引导到新版本,逐步增加直至完全迁移无论采用何种策略,详细的监控和回滚计划都是确保顺利升级的关键分布式数据库简介分布式数据库核心概念CAP理论与取舍分布式数据库系统将数据分散存储在多个物理节点上,通过网络协同工作,对CAP理论指出分布式系统不可能同时满足以下三点用户呈现单一逻辑数据库视图主要技术包括•一致性Consistency所有节点数据保持一致•分片Sharding水平划分数据,不同数据行存储在不同节点•可用性Availability系统持续对外服务•复制Replication数据在多个节点间复制,提高可用性•分区容忍性Partition tolerance网络分区时系统继续运行•分布式事务确保跨节点操作的一致性在实际应用中,分区容忍性通常是必需的,因此系统设计需在一致性和可用性•一致性协议如两阶段提交、Paxos、Raft等间做出取舍不同系统根据业务需求选择不同侧重分布式数据库的优势包括几乎无限的扩展能力、更高的可用性和更好的数据局•CP系统如HBase、MongoDB默认配置,优先保证一致性部性挑战包括复杂的一致性管理、潜在的性能开销和运维复杂度增加•AP系统如Cassandra、DynamoDB,优先保证可用性还有一些系统允许灵活调整一致性级别,如Cosmos DB提供五种一致性选项分片策略是分布式数据库设计的关键决策点常见分片方法包括范围分片,基于键值范围划分数据,简单但可能导致热点;哈希分片,通过哈希函数均匀分布数据,解决热点问题但不利于范围查询;目录分片,使用查找表记录数据位置,灵活但增加复杂度主流分布式数据库产品包括TiDB(兼容MySQL协议的开源NewSQL数据库);CockroachDB(支持强一致性和水平扩展的分布式SQL数据库);Vitess(YouTube开发的MySQL分片方案);分布式版本的传统数据库,如PostgreSQL的Citus和Oracle RAC选择合适的分布式数据库应考虑应用的扩展需求、一致性要求、查询模式和团队技术能力云数据库与大数据云数据库服务类型无服务器数据库大数据存储与处理DBaaS数据库即服务管理完整的数据库自动扩展的数据库服务,无需预先规划容针对PB级数据的存储和分析解决方案,如实例,如AWS RDS、阿里云RDS、Azure量,如AWS AuroraServerless、Azure HDFS、Hive、HBase、Spark大多采用分SQL Database用户专注于数据和应用,而Cosmos DB根据实际工作负载自动调整资布式架构,支持复杂分析和机器学习工作负云提供商负责基础设施维护、备份和高可用源,闲时降至最低消耗,峰值时快速扩展载云平台提供托管服务,如AWS EMR、性提供多种数据库引擎选择,按需付费模适合负载变化大、开发环境和间歇性工作负阿里云MaxCompute、Google BigQuery,式降低前期成本载的场景简化大数据基础设施管理数据集成与湖仓一体连接传统数据库与大数据平台的解决方案,如数据湖Data Lake、数据仓库、湖仓一体Lakehouse架构现代架构通常采用多模数据平台策略,结合关系型、NoSQL和大数据技术,用适合的工具处理不同数据云数据库的优势包括资源弹性、成本优化、内置高可用性和灾难恢复、自动备份和更新迁移到云数据库时需考虑的关键因素包括性能与延迟需求,特别是与应用服务器的网络延迟;安全合规要求,包括数据驻留地和加密需求;成本模型变化,从资本支出转向运营支出;供应商锁定风险,特别是使用云原生专有功能时传统数据库和大数据技术正在融合,许多传统数据库增加了对半结构化数据、机器学习和流处理的支持;同时,大数据平台也增强了事务支持和SQL兼容性未来趋势包括多云数据管理、边缘数据库与云集成、AI驱动的自动化运维,以及基于数据湖的实时分析企业应构建灵活的数据架构,支持多样化的数据需求和持续创新真实开发案例分析需求分析与业务建模从用户故事到数据模型数据库设计与实现2表结构、索引与存储过程应用开发与集成ORM映射与查询优化性能优化与上线监控、调优与维护案例电子商务平台订单管理系统业务需求记录订单信息,包括客户详情、产品清单、价格、支付和配送状态;支持高并发订单处理;提供实时订单状态查询;保留历史订单数据用于分析数据模型设计核心实体包括客户customers、产品products、订单orders和订单明细order_items客户表存储用户信息;产品表包含价格、库存等;订单表记录订单元数据如时间、状态;订单明细表存储每个订单中的产品项使用范式化设计确保数据一致性,同时在查询频繁的地方适当冗余(如订单表中存储总金额)关键SQL实现订单创建时使用事务确保库存更新与订单创建的原子性;使用触发器在订单状态变更时自动记录历史;创建订单状态和客户ID的复合索引加速查询;对大量历史订单使用分区表按月划分数据性能挑战与解决方案处理促销时订单峰值,通过读写分离和连接池扩展;解决热点商品库存更新冲突,引入乐观锁;优化复杂订单查询,创建适当覆盖索引和物化视图;管理增长的历史数据,实施数据归档策略并保持实时数据集精简行业数据库应用场景金融行业电子商务医疗健康银行业务系统对数据库事务和一致性要求极高,通常采用电商平台面临高并发、海量数据和复杂查询挑战产品目医疗系统需平衡数据安全性、访问效率和复杂查询能力Oracle、DB2等企业级关系型数据库,关键交易必须遵循录通常使用关系型数据库如MySQL结合缓存层如Redis;患者记录通常存储在符合HIPAA等规范的关系型数据库ACID原则同时,为支持风险分析和反欺诈,结合大数订单处理系统需要事务支持,同时可能分片以应对高流中;医学影像使用专用存储系统;基因组数据分析可能采据技术处理海量交易记录,如Hadoop和Spark新型金量;用户会话和购物车采用Redis等内存数据库;推荐引用列式存储如HBase;医疗物联网设备数据可使用时间序融科技应用更多引入时间序列数据库处理市场数据,擎可能使用图数据库如Neo4j分析用户关系;搜索功能则列数据库如InfluxDB;临床研究则需要数据仓库支持复MongoDB存储灵活的客户资料依赖Elasticsearch等搜索引擎杂分析大型系统数据架构通常采用多层设计操作数据层处理日常事务,使用优化的OLTP数据库;数据仓库层聚合历史数据,支持报表和分析;数据湖存储原始数据,为探索性分析和机器学习提供基础;数据服务层通过API暴露数据,支持微服务架构技术选型关键考虑因素包括业务关键度与数据一致性要求;预期数据量和增长率;访问模式(读写比例、查询复杂度);可扩展性需求;安全合规要求;团队技术栈与经验;总拥有成本成功的数据架构应平衡当前需求与未来扩展性,选择适合业务特性的技术组合,而非盲目追随技术趋势总结与答疑核心概念掌握数据库原理、SQL语法和优化实用技能培养设计数据模型、集成应用开发深入理解进阶性能调优、高级特性应用综合运用创新解决实际问题、架构设计回顾本课程主要学习要点
1.数据库基础深入理解了数据库系统架构、数据模型和各类数据库的特点与适用场景,为数据库选型和应用奠定基础
2.SQL编程核心掌握了DDL、DML和DCL语言,学习了从基本查询到复杂连接、子查询的SQL技术,能够处理各种数据操作需求
3.数据库设计理解了规范化原则和设计过程,学会通过ER图构建合理的数据模型,确保数据完整性和一致性
4.性能优化了解索引原理与策略,掌握查询优化方法和执行计划分析,能够识别和解决常见性能问题
5.高级特性探索了存储过程、触发器、事务管理和并发控制等高级功能,能够实现复杂的业务逻辑
6.数据库与应用集成学习了不同编程语言与数据库交互的方法,包括JDBC、ODBC和各类ORM框架的使用
7.现代数据库趋势接触了NoSQL、分布式数据库和云数据库等新兴技术,了解大数据时代的数据管理解决方案数据库编程是一个持续学习的领域,建议通过实际项目积累经验,关注技术发展趋势,不断拓展知识广度和深度我们鼓励大家提出问题,分享经验,共同进步。
个人认证
优秀文档
获得点赞 0