1)数据库完整性
①实体完整性(Entity Integrity):自己
a)一个关系对应现实世界中一个实体集。--ER模型
b)现实世界中的实体具有某种惟一性标识。--主键
c)主关键字是多个属性的组合,则所有主属性均不得取空值。--隐含的索引
②域完整性(Domain Integrity): 自己的局部
保证数据库字段取值的合理性。属性值应是域中的值,这是关系模式规定了的。
包括:
a)检查(CHECK)
b)默认值(DEFAULT)
c)不为空(NOT NULL)
d)可为空(NULL)等
③参照完整性(Referential Integrity): 自己与其他"实体”的关系
参照完整性是定义建立关系之间联系的主关键字与外部关键字引用的约束条件。
a)关系数据库中通常都包含多个存在相互联系的关系,关系与关系之间的联系是通过公共属性来实现的。
b)所谓公共属性,它是一个关系R(称为被参照关系或目标关系)的主关键字,同时又是另一关系K(称为参照关系)的外部关键字。如果参照关系K中外部关键字的取值,要么与被参照关系R中某元组主关键字的值相同,要么取空值,那么,在这两个关系间建立关联的主关键字和外部关键字引用,符合参照完整性规则要求。如果参照关系K的外部关键字也是其主关键字,根据实体完整性要求,主关键字不得取空值,因此,参照关系K外部关键字的取值实际上只能取相应被参照关系R中已经存在的主关键字值。
④用户自定义完整性(User-definedIntegrity):用户增加的限制
用户定义完整性则是根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。这一约束机制一般不应由应用程序提供,而应有由关系模型提供定义并检验。用户定义完整性主要包括字段有效性约束和记录有效性。
2)语义优化
①基本概念
因为语义的原因,使得SQL可以被优化。包括两个基本概念:
a)语义转换。因为完整性限制等的原因使得一个转换成立的情况称为语义转换。
b)语义优化。因为语义转换形成的优化称为语义优化。
语义转换其实是根据完整性约束等信息对“某特定语义”进行推理,进而得到的一种查询效率不同但结果相同的查询。
语义优化是从语义的角度对SQL进行优化,不是一种形式上的优化,所以其优化的范围,可能覆盖其他类型的优化范围。
②连接消除(Join Elimination)(MySQL不支持)
对一些连接操作先不必评估代价,根据已知信息(主要依据完整性约束等,但不全是依据完整性约束)能推知结果或得到一个简化的操作。
例如:
利用A、B两个基表做自然连接,创建一个视图V,如果在视图V上执行查询只涉及其中一个基表的信息,则对视图的查询完全可以转化为对某个基表的查询。
③连接引入(Join Introduction)
增加连接有助于原始关系变小或原关系的选择率降低。
④谓词引入(Predicate Introduction)(MySQL不支持)
根据完整性约束等信息,引入新谓词,如引入基于索引的列,可能使得查询更快;
例如:
一个表上,有“c1<c2”的列约束,c2列上存在一个索引,查询语句中的WHERE条件有“c1>200”,则可以推知“c2>200”,WHER条件变更为“c1>200 AND c2>200 AND c1<c2”,由此可以利用c2列上的索引,对查询语句进行优化;如果c2列上的索引的选择率很低,则优化效果会更高。
④检测空回答集(Detecting the Empty Answer Set)(MySQL支持)
查询语句中的谓词与约束相悖,可以推知条件结果为FALSE,也许最终的结果集能为空;
例如:
CHECK约束限定“score”列的范围是60到100,而一个查询条件是“score<60”,则能立刻推知条件不成立。
⑤排序优化(Order Optimizer)(MySQL部分支持)
ORDERBY操作通常由索引或排序(sort)完成;如果能够利用索引,则排序操作可省略;另外,结合分组等操作,考虑ORDERBY操作的优化。
⑥唯一性使用(Exploiting Uniqueness)(MySQL支持)
利用唯一性、索引等特点,检查是否存在不必要的DISTINCT操作
例如:
在主键上执行DISTINCT操作,若有则可以把DISTINCT消除掉。
摘自《数据库查询优化器的艺术》一书