关系模型的完整性约束
- 实体完整性:关系必须有主键,主键必须唯一且不能为空
- 参照完整性:维护实体之间的引用关系,外键可以为空,或者其值为被参照关系对应的主键值。
- 用户定义的完整性:由应用环境决定,针对具体关系数据库的约束条件
索引
1. 索引的概念
索引是一种数据库对象(数据结构),是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。应用索引可以提高查询性能的数据结构,可以将索引理解为目录。通过索引,数据库程序无需扫描整个表就可以找到数据,因此索引可以大大提高数据库检索的效率。
2. 索引的类型
a、 按照数据表中的记录存储顺序划分,分为聚簇索引和非聚簇索引
1)聚簇索引
聚簇索引即指明数据的物理存储顺序的索引,数据行的物理存储顺序与索引存储顺序完全相同,索引位置决定了数据库中表的记录顺序,先将表中数据进行排序,重新存储。
2)非聚簇索引
非聚簇索引完全独立于数据行,其叶子结点存储了组成非聚簇索引的关键字值和行定位器(指针),不影响实际的存储顺序,并通过指针定位数据。改变一个建立非聚簇索引的表中的数据时,必须同时更新索引,若一个表频繁地更新数据,不要对它建立太多的非聚簇索引。
b、按照索引行是否有相同的值进行划分,分为唯一索引和普通索引
1)唯一索引
唯一索引的数据列可以为空,但是只要存在数据值,就必须是唯一的
2)普通索引
普通索引可以有相同的索引值
3. 建立索引的优点
- 通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性
- 加快数据的检索速度,这是创建索引的最主要的原因
- 加速表与表之间的连接,特别是在实现数据的参照完整性方面特别有意义
- 使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
4. 建立索引的缺点
- 创建索引和维护索引要耗费时间。这种时间随着数据量的增加而增加
- 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果建立非聚簇索引,那么需要的空间更大。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度
事务
事务是作为一个逻辑单元执行的一组操作(一组语句),是一个不可分割的整体,任何一个语句操作失败则整个事务操作失败,之后就会回滚到操作前的状态。如果要确保某组任务要么都执行要么都不执行,就可以使用事务。
事务的四个属性(ACID)
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 永久性(Durability)
事务并发操作带来的数据不一致主要包括
(1)丢失修改
两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失
(2)不可重复读
事务T1读入数据后,事务T2执行更新操作,使得T1无法再现前一次读取的结果,不可重复读出现的条件是:事务T1要有两次读,有以下三种情况:
- 事务T1读取数据后,事务T2对其修改,事务T1再次读取数据,读到的数据和前一次不同
- 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同的条件读取数据时,发现部分数据消失了。
- 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
(3)读 “脏” 数据
事务T1修改某些数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某些原因被撤回,这时T1已经修改过数的据恢复原值,T2读到的数据就和数据库中的数据不一致,T2就读到了“脏”数据。
存储过程和触发器
(1)存储过程的定义
存储过程是为了完成某一特定功能由用户定义的一组SQL语句的集合,它经过第一次编译后再次调用的时候不需要再次编译,从而提高数据库的执行效率。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行该存储过程。存储过程可调用其它存储过程
(2)存储过程的优缺点
优点:SQL语句的执行性能会得到提高,充分利用了数据库本身的优越性,逻辑的修改能够迅速发布
缺点:调试存在困难,可移植性不高
(3)触发器
触发器是一种特殊的存储过程,通过事件触发而被执行,触发器常用来加强数据的完整性约束和业务规则等,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。
对于大数据量,要提高查询效率。在数据库设计方面可做以下考虑:
1)考虑建立索引,基于主键的查询可提高效率
2)考虑表分区,比如按范围分,按业务分等,提高查询效率
3)在表设计时,尽量使用数值型字段,避免将能使用数值型的字段设计为字符型,既可节省存储开销,又可提高查询的性能
4)考虑表的设计模式,尽量范式化设计
5)考虑加大数据库缓存,或引入大内存,提高数据查询效率
SQL语句设计方面,应该重点考虑以下几点:
1)SQL语句优化,整合复杂的多表查询,可借助SQL优化工具等识别执行效率低下的SQL语句
2)避免产生全表扫描,可能导致全表扫描的典型情况如下:
①查询语句的where子句中时使用or、!=等运算符
②使用in、not in、等子查询语句
③where子句中对某个字段进行表达式操作
④where子句中对某个字段进行函数操作
3)可考虑使用存储过程,提高SQL语句的执行效率