数据库系统
数据库系统可分为3种类型:
- 层次
- 网状
- 关系
完整性
SQL | 数据完整性- 域完整性:指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等
- 实体完整性(Entity Integrity):指表中行的完整性,关系的主关键字不能重复也不能取空值。
- 参照完整性(引用完整性,Referential Integrity):基于外键与被引用主键之间的关系,确保键值在所有表中的一致性;是定义建立关系之间联系的主关键字与外部关键字引用的约束条件。
- 用户完整性(User Defined Integrity):根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。
- 用户定义完整性主要包括:字段有效性约束、记录有效性
要求主表中没有相关记录就不能将记录添加到相关表中,则应该在表关系中设置参照完整性。
SQL
- 数据库管理系统的主要作用:实现数据的统一管理以及对数据库数据的一切操作
关系型数据库
MySQL
MySQLSQL Server
SQL ServerOracle
非关系型数据库 NoSQL
Redis
MongoDB
与数据库管理相关的技术:
- RDBMS:关系型数据库管理系统
- NoSQL:非关系型数据库
- NewSQL:新型关系型数据库
- HBase:是一个分布式的面向列的数据库
与数据库管理无关的技术:
- Ngnix:是一个高性能的HTTP和反向***web服务器,同时也提供了IMAP/POP3/SMTP服务
- ActiveMQ:Apache下的一个中间件
索引
- 索引对数据插入的效率有一定的影响
- 对于数据重复度高,值范围有限的列如果建索引建议使用位图索引
- 可以在多个列上建立联合索引
- 当用户查询索引字段时,索引可以快速地执行检索操作,借助索引,在执行查询的时候不需要扫描整个表就可以快速地找到所需要的数据
- 创建索引和维护索引要耗费时间、空间,当对表中的数据进行增加、删除和修改的时候,会降低数据的维护速度
- 建立索引是为了让检索查询的过程更快捷方便
适合建立索引的字段:
- 外键字段
- 主键字段
- 在where子句中的字段
在一个表中,可以建立:
- 多个普通索引
- 多个唯一索引
- 多个候选索引
- 一个主索引
唯一索引
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
- MySQL中一张表可以有多个唯一索引
- 唯一性索引并不一定是主键;唯一性索引列允许空值,而主键列不允许为空值
唯一索引 | 主键 | |
---|---|---|
本质 | 索引 | 约束 |
数目 | 可以有多个 | 只能有一个 |
关系 | 唯一性索引并不一定就是主键 | 主键一定包含一个唯一性索引 |
引用 | 不能被其他表引用为外键 | 可以被其他表引用为外键 |
B+树
- B+树的最低层用的是双向链表结构
为什么B+树适合数据库索引?
- B+树的磁盘读写代价更低
- B+树的内部结点没有指向关键字具体信息的指针,因此其内部结点相对B树更小
- B+树的查询效率更加稳定
为什么不用红黑树、B树、Hash表来做索引?
- 红黑树虽然是一棵自平衡树,且性能优秀,但随着数据量的急速增加,树的高度也在激素地增加。每一层加载判断会先进行IO操作,IO非常耗时,因此不用红黑树来做数据库的索引
- B树虽然可以控制层数(即IO操作的次数),但其将数据都存储在了结点上,这样大大增加了一次IO读取数据的数量(一般一次为16k一个结点 效率是最高的)。而且B树不能进行范围查找
- Hash表的查找很优秀,增删改查时间复杂度都可以在常数时间内去完成(时间复杂度为$O(1)$),对于查找单个数据操作的Hash表性能是优秀的,但Hash表不适合用于范围查找
关于数据库索引,以下说法错误的是?
- 针对某些字段建立索引,能够有效的减少相关数据库表的磁盘空间占用(×)
- 针对某些字段建立索引,能够有效的提升相关字段的读与写的效率(×)
- 常见数据库管理系统,通常使用hash表来存储索引(×,应该是B+树)
- 索引是为了提高查询效率的,通过建立索引查询效率会得到提高(×)
- 唯一索引是一种特殊的索引,表中的行的物理顺序与索引顺序一致,且不允许两行数据在索引列上有相同的值(×,唯一索引的列的物理顺序并不和索引顺序一致,只有聚集索引列的物理顺序和逻辑顺序一致,一个表也只能有一个聚集索引)
- 数据库索引的存在,可能导致相关字段删除的效率降低(√,因为删除相关字段需要动态维护索引)