数据库相关知识
-
事务是逻辑上的一组操作,要么都执行,要么都不执行
-
事务的四大特性
- 原子性:事务时最小的执行单位,不允许分隔。
- 一致性:执行事务前后,数据保持一致,多个事务对同一数据读取的结果 是相同的
- 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
- 持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
-
并发事务问题:
- 脏读:后者对还未同步到数据库中的数据再次修改
- 丢失修改:两者同时修改
- 不可重复读:一个事务两次读之间有事务对其数据进行了修改
- 幻读:类似于不可重复读(修改)幻读重点是增加删除
-
sql四个隔离级别:
隔离级别 脏读 不可重复读 幻读 READ-UNCOMMITTED(读取未提交) √ √ √ READ-COMMITTED(读取已提交) × √ √ REPEATABLE-READ(可重复读) × × √ SERIALIZABLE(可串行化) × × × -
索引
- 优点:
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
- 可以大大加快检索速度
- 帮助服务器避免排序和临时表
- 将随机IO变成顺序IO
- 加速表与表之间的连接
- 优点:
- 缺点:
- 当进行增删修的时候索引也需要动态维护,降低了维护速度
- 需要占用物理空间
- 创建索引和维护索引需要时间
- 通过将无序数据变成有序数据,来加快查询速度
- 当进行增删修的时候索引也需要动态维护,降低了维护速度
- 注意事项:
- 避免where子句对字段施加函数,会造成无法命中索引
- 在使用InnoDB时使用与业务无关的自增主键作为左键,即使用逻辑主键而不要更用业务主键
- 将打算加索引的列设置为NOT NULL,否则将导致引擎放弃使用索引
- 删除长期未使用的索引
- 在使用limit offset查询缓慢时,可以使用借助索引提交性能
- 聚集(主键)和非聚集(非主键)索引
- 区别聚合索引在叶子节点存储的是表中的数据,非聚合索引在叶子节点存储的是主键和索引列,所以非聚合索引也叫做二级索引。
- 索引最左匹配原则(MySQL会质疑向右匹配知道遇到范围查询)
- 索引可以简单如一个列,也可以复杂如多个列,即联合索引
- 如果是联合索引,内码key也由多个列组成,同时索引也只能用于查找key是否存在、
- 因此列的排列顺序决定了可命中索引的列数
- 使用保留字UNION可以使索引值在基本表中唯一
- 覆盖索引:就是包含了所有查询字段 (where,select,ordery by,group by 包含的字段) 的索引
- 好处:避免Innodb表进行索引的二次查询;可以把随机IO变成顺序IO加快查询效率
- 避免where子句对字段施加函数,会造成无法命中索引
-
锁:处理解决并发问题
- 分类
- 从数据库:排它锁(X锁),共享锁(S,读锁),更新锁(U)
- 从程序员:悲观锁,乐观锁
- InnpDB支持行锁和表锁,而MyISAM只支持表锁
- 判断死锁
- 超时法
- 等待图法:出现回路
- 减少死锁
- 以固定的顺序访问表和行
- 大事务拆小
- 降低隔离级别
- 为表添加合理的索引
- 乐观锁和悲观锁
- 乐观锁:认为不会锁定的情况下去更新数据,如果发现不对劲,才不更新(回滚)。在数据库中往往添加一个version字段来实现。适用于多读的应用类型,提高吞吐量
- 悲观锁:用的就是数据库的行锁,认为数据库会发生并发冲突,直接上来就把数据锁住,其他事务不能修改,直至提交了当前事务
- 分类
-
大表优化
- 限定数据的范围
- 读写分离,主库负责写,从库负责读
- 垂直分区:根据数据库里面数据表的相关性进行拆分,分列
- 优点:列数据变小,在查询是减少读取的Block数,减少I/O次数,还可以简化表的结构,易于维护
- 缺点:主键出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂
- 水平分区:保持数据结构不变,通过某种策略存储数据分片。水平拆分可以支持很大的数据量
-
MySQL主要Server 层和引擎层:
- Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog 只有 InnoDB 有。
- 引擎层是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。
-
SQL 等执行过程分为两类
- 一类对于查询等过程如下:权限校验—查询缓存—分析器—优化器—权限校验—执行器—引擎
- 对于更新等语句执行流程如下:分析器----权限校验----执行器—擎---redo log prepare—binlog—redo log commit
-
数据库模型:
- 层级模型
- 网状模型
- 关系模型
-
对于主键来说基本原则就是:不使用任何业务相关的字段作为主键。(身份证,手机号)
-
另外还有联合主键,其允许部分有重复数据
-
外键:关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。
-
查询SELECT:
SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合计函数] -> HAVING -> ORDER BY -> LIMIT
- select_expr
- 可以用 * 表示所有字段。
- 可以使用表达式(计算公式、函数调用、字段也是个表达式)
- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。
- 使用关键字as或者省略
- FROM 子句:用于标识查询来源。
- 可以为表起别名。使用as关键字。
- from子句后,可以同时出现多个表。
- WHERE 子句:从from获得的数据源中进行筛选;整型1表示真,0表示假。
- GROUP BY 子句, 分组子句
- GROUP BY 字段/别名 [排序方式]
- 分组后会进行排序。升序:ASC,降序:DESC
- sum 求和
- max 求最大值
- min 求最小值
- avg 求平均值
- HAVING 子句,条件子句: 与 where 功能、用法相同,执行时机不同。
where 在开始时执行检测数据,对原数据进行过滤。
having 对筛选出的结果再次进行过滤。
having 字段必须是查询出来的,where 字段必须是数据表存在的。
where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。
where 不可以使用合计函数。一般需用合计函数才会用 having
- ORDER BY 子句,排序子句
- order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]…
- 升序:ASC,降序:DESC
- 支持多个字段的排序。
- LIMIT 子句,限制结果数量子句
- DISTINCT, ALL 选项
- select_expr
-
插入:INSERT INTO <表名> (字段1, 字段2, …) VALUES (值1, 值2, …);
-
数据操作:
- 增:INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), …]
- 查:SELECT 字段列表 FROM 表名[ 其他子句]
- 删: DELETE FROM 表名[ 删除条件子句]
- 改: UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新条件]
-
数据库操作:
- 查看当前数据库: SELECT DATABASE();
- 显示当前时间、用户名、数据库版本:SELECT now() , user() , version() ;
- 创建库: CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项
- 查看已有库:SHOW DATABASES
- 查看当前库信息:SHOW CREATE DATABASE 数据库名
- 修改库的选项信息:ALTER DATABASE 库名 选项信息
- 删除库: DROP DATABASE[ IF EXISTS] 数据库名(同时删除数据库相关目录以及目录内容)
-
表的操作:
- 创建表:CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项]
- 查看表: SHOW TABLES FROM 表名
- 表选项
- 字符集:CHARSET = charset_name
- 自增起始数:AUTO_INCREMENT = 行数
- 数据文件目录:DATA DIRECTORY = ‘目录’
- 索引文件目录:INDEX DIRECTORY = ‘目录’
- 表注释: COMMENT = ‘string’
- 分区选项;PARTITION BY …
- 查看表结构:SHOW CREATE TABLE 表名 (信息更详细)
- 查看所有表:SHOW TABLES FROM 表名
- 修改表:
- 修改表本身的选项: ALTER TABLE 表名 表的选项
- 对表进行重命名:RENAME TABLE 原表名 TO 库名.表名 (可将表移动到另一个数据库)
- 删除表: DROP TABLE[ IF EXISTS] 表名 …
- 清空表数据:TRUNCATE [TABLE] 表名
- 复制表结构:CREATE TABLE 表名 LIKE 要复制的表名
- 复制表结构和数据:CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名
- 检查表是否有错误:CHECK TABLE tbl_name [, tbl_name] … [option] …
- 优化表:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
- 修复表:REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] … [QUICK] [EXTENDED] [USE_FRM]
- 分析表: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
-
更新数据:UPDATE <表名> SET 字段1=值1, 字段2=值2, … WHERE …;
-
删除数据:DELETE FROM <表名> WHERE …;
-
切换数据库: USE <数据库>
-
显示当前数据库所有表: SHOW <表名>
-
插入或替换:REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);
-
插入或更新:INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99) ON DUPLICATE KEY UPDATE name=‘小明’, gender=‘F’, score=99;
-
插入或忽略:INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);
-
快照:CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;
-
关系数据库规范化是为了解决数据库中插入,删除,数据冗余问题引入的
-
独立性
- 逻辑独立性:应用程序与数据库中数据的逻辑结构是相互独立的 是外模式/模式映像
- 物理独立性:用户的应用程序与存储在磁盘上数据库中的数据是相互独立的。是模式/内模式映像
-
向用户授权:GRANT <权限>[,<权限>]… [ON <对象类型> <对象名>] TO <用户>[,<用户>]… [WITH GRANT OPTION];
-
实体中的任一关键字,可能由一个或者多个可区别的实体稽核中不同个体的属性组成
-
关系型数据库三级模式二级映射,保证了逻辑独立性和物理独立性
-
E-R模型(实体-联系模型)
- E-R模型可以成功描述数据库所存储的数据
- 基本要素
- 实体
- 属性
- 联系
-
触发器:是用户定义在关系上的一类由事件驱动的特殊过程。
- 其中事件是指:增删改(更新)
-
数据库三级模式:外模式、模式、内模式
- 模式:逻辑模式、概念模式:描述的是全局逻辑结构,一个数据库只要一个模式,模式是数据库的中心与关键。
- 外模式:子模式、用户模式:是数据库用户的数据视图。是模式的一个子集,多个,保证数据安全性
- 内模式:存储模式:一个数据库只有一个==内模式,它是数据物理结构和存储方式的描述,是数据库内部的表示方法。
-
两级映射:
- 外模式——模式
- 模式——内模式
-
SQL语言的组成
- DCL:数据控制语句
- grant
- revoke
- DDL:数据定义语句
- DROP
- CREATE
- ALTER
- DML:数据操纵语句
- INSERT
- UPDATE
- DELETE
- DCL:数据控制语句
-
三大范式:
- 第一范式:字段不能再分,
- 第二范式:在第一范式的基础上,一行数据只做一件事情,不能出现部分依赖,消除复核主键就可以避免出现部分依赖
- 第三范式:在第二范式的基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)每个属性都和主键有直接相关关系。
-
ORDB中复合类型:
- 结构(行)类型: 不同类型 有序
- 数组类型:同类 有序
- 包(多集)类型:同类 无序 可以重复
- 集合类型:同类 无序 不重复
- 列表类型:同类 有序 可以重复
-
数据库系统的主要特点:
- 数据结构化
- 数据度的冗余度小
- 较高的数据独立性
-
数据库设计的四个阶段
- 需求分析
- 概念设计:E-R方法,将现实世界的信息结构统一由实体、属性以及实体之间的联系来描述
- 逻辑设计
- 物理设计
-
属性:
- 候选键(候选关键字、候选码),能唯一表示关系中的元组
- 主关系键(主键、主码、关系键、关键字):作为数据操作的依据,从候选键中选择
- 主属性:包含在任一候选关键字中的各个属性
- 非码属性:不包含在任何候选键中的属性
-
两段锁协议:所有事务必须分两个阶段对数据项加锁和解锁,进行读之前申请S锁,写之前申请X锁
-
列属性:
- 主键:PRIMARY 能唯一表示记录的字段,唯一性,不可空,可以由多个字段共同组成,此时需要在字段列表后声明的方法。
- 唯一索引(唯一约束):UNIQUE:使得某字段的值不能重复
- 约束:NULL:不是数据类型,是列的一个属性。
- 默认值属性 DEFAULT:当前字段默认值
- 自动增长约束 AUTO-INCREMENT:自动增长必须为索引(主键或unique)
- 注释 Comment
- 外键约束 FOREIGN KEY :用于限制主表与从表数据完整性