关系模型的完整性约束
- 实体完整性:关系必须有主键,主键必须唯一且不能为空
- 参照完整性:维护实体之间的引用关系,外键可以为空,或者其值为被参照关系对应的主键值。
- 用户定义的完整性:由应用环境决定,针对具体关系数据库的约束条件
索引
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语句的执行效率