数据库基础知识

数据库相关知识

  1. 事务是逻辑上的一组操作,要么都执行,要么都不执行

  2. 事务的四大特性

    • 原子性:事务时最小的执行单位,不允许分隔。
    • 一致性:执行事务前后,数据保持一致,多个事务对同一数据读取的结果 是相同的
    • 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
    • 持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
  3. 并发事务问题:

    • 脏读:后者对还未同步到数据库中的数据再次修改
    • 丢失修改:两者同时修改
    • 不可重复读:一个事务两次读之间有事务对其数据进行了修改
    • 幻读:类似于不可重复读(修改)幻读重点是增加删除
  4. sql四个隔离级别:

    隔离级别 脏读 不可重复读 幻读
    READ-UNCOMMITTED(读取未提交)
    READ-COMMITTED(读取已提交) ×
    REPEATABLE-READ(可重复读) × ×
    SERIALIZABLE(可串行化) × × ×
  5. 索引

    • 优点:
      • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
      • 可以大大加快检索速度
      • 帮助服务器避免排序和临时表
      • 将随机IO变成顺序IO
      • 加速表与表之间的连接
  • 缺点:
    • 当进行增删修的时候索引也需要动态维护,降低了维护速度
      • 需要占用物理空间
      • 创建索引和维护索引需要时间
    • 通过将无序数据变成有序数据,来加快查询速度
  • 注意事项:
    • 避免where子句对字段施加函数,会造成无法命中索引
      • 在使用InnoDB时使用与业务无关的自增主键作为左键,即使用逻辑主键而不要更用业务主键
    • 将打算加索引的列设置为NOT NULL,否则将导致引擎放弃使用索引
      • 删除长期未使用的索引
      • 在使用limit offset查询缓慢时,可以使用借助索引提交性能
    • 聚集(主键)和非聚集(非主键)索引
    • 区别聚合索引在叶子节点存储的是表中的数据,非聚合索引在叶子节点存储的是主键和索引列,所以非聚合索引也叫做二级索引。
    • 索引最左匹配原则(MySQL会质疑向右匹配知道遇到范围查询)
    • 索引可以简单如一个列,也可以复杂如多个列,即联合索引
      • 如果是联合索引,内码key也由多个列组成,同时索引也只能用于查找key是否存在、
    • 因此列的排列顺序决定了可命中索引的列数
    • 使用保留字UNION可以使索引值在基本表中唯一
    • 覆盖索引:就是包含了所有查询字段 (where,select,ordery by,group by 包含的字段) 的索引
      • 好处:避免Innodb表进行索引的二次查询;可以把随机IO变成顺序IO加快查询效率
  1. :处理解决并发问题

    • 分类
      • 从数据库:排它锁(X锁),共享锁(S,读锁),更新锁(U)
      • 从程序员:悲观锁,乐观锁
    • InnpDB支持行锁和表锁,而MyISAM只支持表锁
    • 判断死锁
      • 超时法
      • 等待图法:出现回路
    • 减少死锁
      • 以固定的顺序访问表和行
      • 大事务拆小
      • 降低隔离级别
      • 为表添加合理的索引
    • 乐观锁和悲观锁
      • 乐观锁:认为不会锁定的情况下去更新数据,如果发现不对劲,才不更新(回滚)。在数据库中往往添加一个version字段来实现。适用于多读的应用类型,提高吞吐量
      • 悲观锁:用的就是数据库的行锁,认为数据库会发生并发冲突,直接上来就把数据锁住,其他事务不能修改,直至提交了当前事务
  2. 大表优化

    • 限定数据的范围
    • 读写分离,主库负责写,从库负责读
    • 垂直分区:根据数据库里面数据表的相关性进行拆分,分列
      • 优点:列数据变小,在查询是减少读取的Block数,减少I/O次数,还可以简化表的结构,易于维护
      • 缺点:主键出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂
    • 水平分区:保持数据结构不变,通过某种策略存储数据分片。水平拆分可以支持很大的数据量
  3. MySQL主要Server 层和引擎层:

    • Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog 只有 InnoDB 有。
    • 引擎层是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。
  4. SQL 等执行过程分为两类

    • 一类对于查询等过程如下:权限校验—查询缓存—分析器—优化器—权限校验—执行器—引擎
    • 对于更新等语句执行流程如下:分析器----权限校验----执行器—擎---redo log prepare—binlog—redo log commit
  5. 数据库模型:

    • 层级模型
    • 网状模型
    • 关系模型
  6. 对于主键来说基本原则就是:不使用任何业务相关的字段作为主键。(身份证,手机号)

  7. 另外还有联合主键,其允许部分有重复数据

  8. 外键:关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。

  9. 查询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 选项
  10. 插入:INSERT INTO <表名> (字段1, 字段2, …) VALUES (值1, 值2, …);

  11. 数据操作:

    1. 增:INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), …]
    2. 查:SELECT 字段列表 FROM 表名[ 其他子句]
    3. 删: DELETE FROM 表名[ 删除条件子句]
    4. 改: UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新条件]
  12. 数据库操作

    1. 查看当前数据库: SELECT DATABASE();
    2. 显示当前时间、用户名、数据库版本:SELECT now() , user() , version() ;
    3. 创建库: CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项
    4. 查看已有库:SHOW DATABASES
    5. 查看当前库信息:SHOW CREATE DATABASE 数据库名
    6. 修改库的选项信息:ALTER DATABASE 库名 选项信息
    7. 删除库: DROP DATABASE[ IF EXISTS] 数据库名(同时删除数据库相关目录以及目录内容)
  13. 表的操作:

    1. 创建表:CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项]
    2. 查看表: SHOW TABLES FROM 表名
    3. 表选项
      • 字符集:CHARSET = charset_name
      • 自增起始数:AUTO_INCREMENT = 行数
      • 数据文件目录:DATA DIRECTORY = ‘目录’
      • 索引文件目录:INDEX DIRECTORY = ‘目录’
      • 表注释: COMMENT = ‘string’
      • 分区选项;PARTITION BY …
    4. 查看表结构:SHOW CREATE TABLE 表名 (信息更详细)
    5. 查看所有表:SHOW TABLES FROM 表名
    6. 修改表:
      • 修改表本身的选项: ALTER TABLE 表名 表的选项
      • 对表进行重命名:RENAME TABLE 原表名 TO 库名.表名 (可将表移动到另一个数据库)
    7. 删除表: DROP TABLE[ IF EXISTS] 表名 …
    8. 清空表数据:TRUNCATE [TABLE] 表名
    9. 复制表结构:CREATE TABLE 表名 LIKE 要复制的表名
    10. 复制表结构和数据:CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名
    11. 检查表是否有错误:CHECK TABLE tbl_name [, tbl_name] … [option] …
    12. 优化表:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
    13. 修复表:REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] … [QUICK] [EXTENDED] [USE_FRM]
    14. 分析表: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
  14. 更新数据:UPDATE <表名> SET 字段1=值1, 字段2=值2, … WHERE …;

  15. 删除数据:DELETE FROM <表名> WHERE …;

  16. 切换数据库: USE <数据库>

  17. 显示当前数据库所有表: SHOW <表名>

  18. 插入或替换:REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);

  19. 插入或更新:INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99) ON DUPLICATE KEY UPDATE name=‘小明’, gender=‘F’, score=99;

  20. 插入或忽略:INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);

  21. 快照:CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;

  22. 关系数据库规范化是为了解决数据库中插入,删除,数据冗余问题引入的

  23. 独立性

    • 逻辑独立性:应用程序与数据库中数据的逻辑结构是相互独立的 是外模式/模式映像
    • 物理独立性:用户的应用程序与存储在磁盘上数据库中的数据是相互独立的。是模式/内模式映像
  24. 向用户授权:GRANT <权限>[,<权限>]… [ON <对象类型> <对象名>] TO <用户>[,<用户>]… [WITH GRANT OPTION];

  25. 实体中的任一关键字,可能由一个或者多个可区别的实体稽核中不同个体的属性组成

  26. 关系型数据库三级模式二级映射,保证了逻辑独立性和物理独立性

  27. E-R模型(实体-联系模型)

    • E-R模型可以成功描述数据库所存储的数据
    • 基本要素
      • 实体
      • 属性
      • 联系
  28. 触发器:是用户定义在关系上的一类由事件驱动的特殊过程。

    • 其中事件是指:增删改(更新)
  29. 数据库三级模式:外模式、模式、内模式

    • 模式:逻辑模式、概念模式:描述的是全局逻辑结构,一个数据库只要一个模式,模式是数据库的中心与关键。
    • 外模式:子模式、用户模式:是数据库用户的数据视图。是模式的一个子集,多个,保证数据安全性
    • 内模式:存储模式:一个数据库只有一个==内模式,它是数据物理结构和存储方式的描述,是数据库内部的表示方法。
  30. 两级映射:

    • 外模式——模式
    • 模式——内模式
  31. SQL语言的组成

    • DCL:数据控制语句
      • grant
      • revoke
    • DDL:数据定义语句
      • DROP
      • CREATE
      • ALTER
    • DML:数据操纵语句
      • INSERT
      • UPDATE
      • DELETE
  32. 三大范式:

    • 第一范式:字段不能再分,
    • 第二范式:在第一范式的基础上,一行数据只做一件事情,不能出现部分依赖,消除复核主键就可以避免出现部分依赖
    • 第三范式:在第二范式的基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)每个属性都和主键有直接相关关系。
  33. ORDB中复合类型:

    • 结构(行)类型: 不同类型 有序
    • 数组类型:同类 有序
    • 包(多集)类型:同类 无序 可以重复
    • 集合类型:同类 无序 不重复
    • 列表类型:同类 有序 可以重复
  34. 数据库系统的主要特点:

    • 数据结构化
    • 数据度的冗余度小
    • 较高的数据独立性
  35. 数据库设计的四个阶段

    • 需求分析
    • 概念设计:E-R方法,将现实世界的信息结构统一由实体、属性以及实体之间的联系来描述
    • 逻辑设计
    • 物理设计
  36. 属性:

    • 候选键(候选关键字、候选码),能唯一表示关系中的元组
    • 主关系键(主键、主码、关系键、关键字):作为数据操作的依据,从候选键中选择
    • 主属性:包含在任一候选关键字中的各个属性
    • 非码属性:不包含在任何候选键中的属性
  37. 两段锁协议:所有事务必须分两个阶段对数据项加锁和解锁,进行读之前申请S锁,写之前申请X锁

  38. 列属性:

    1. 主键:PRIMARY 能唯一表示记录的字段,唯一性,不可空,可以由多个字段共同组成,此时需要在字段列表后声明的方法。
    2. 唯一索引(唯一约束):UNIQUE:使得某字段的值不能重复
    3. 约束:NULL:不是数据类型,是列的一个属性。
    4. 默认值属性 DEFAULT:当前字段默认值
    5. 自动增长约束 AUTO-INCREMENT:自动增长必须为索引(主键或unique)
    6. 注释 Comment
    7. 外键约束 FOREIGN KEY :用于限制主表与从表数据完整性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章