SQL优化--逻辑优化--数据库的约束规则与语义优化

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消除掉。

摘自《数据库查询优化器的艺术》一书

时间: 2024-12-13 08:42:13

SQL优化--逻辑优化--数据库的约束规则与语义优化的相关文章

【Oracle 优化】Oracle数据库提高命中率及相关优化

本文是关于Oracle数据库调试与优化方面的文章,主要介绍Oracle数据库中命中率相关的问题,包括不同的算法之间性能的比对. 关于Oracle中各个命中率的计算以及相关的调优 1)Library Cache的命中率: .计算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins) SQL>SELECT SUM(pinhits)/sum(pins) FROM V$LIBRARYCACHE; 通常在98%以上,否则,需要要考虑加大共享池,绑定变量,

SQL优化--逻辑优化--非SPJ优化

1)GROUP BY分组转换(MySQL不支持) ①分组操作下移 GROUPBY 操作可能较大幅度减小关系元组的个数,如果能够对某个关系先进行分组操作,然后再进行表之间的连接,很可能提高连接效率.这种优化方式是把分组操作提前执行.下移的含义,是在查询树上,让分组操作尽量靠近叶子结点,使得分组操作的结点低于一些选择操作. ②分组操作上移 如果连接操作能够过滤掉大部分元组,则先进行连接后进行GROUPBY 操作,可能提高分组操作的效率.这种优化方式是把分组操作置后执行.上移的含义,和下移正好相反.

SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问

最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN具QI. 开始装逼... 首先来一条执行效率不怎么样的SQL语句 将SQL Server Profiler中的跟踪文件保存至本地 打开数据库优化引擎,选择工作负荷文件以及需要优化的数据库/表,点击开始分析 分析结束后会给你索引建议,执行操作→应用建议,将会自动生成SQL语句并执行,完成后再执行试试那

数据库性能优化一:数据库自身优化(大数据量)

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第一部分 数据库性能优化一:数据库自身优化 优化①:增加次数据文件,设置文件自动增长(粗略数据分区) 1.1:增加次数据文件 从SQL SERVER 2005开始,数据库不默认生成NDF数据文件,一般情况下有一个主数据文件(MDF)就够了,但是有些大型的数据库,由于信息很多,而且查询频繁,所以为了提高查询速度,可以把一些表或者一些表中的部分记录分开存储在不同的数据文件里由于CPU和内存的速度远大于硬盘的读写速度,所以可

MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化

第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优化,存储引擎的相关参数设置建议将主要在下一章“常用存储引擎的优化”中进行说明. 10.1 MySQL 安装优化 选择合适的发行版本 1. 二进制发行版(包括RPM等包装好的特定二进制版本) 由于MySQL开源的特性,不仅仅MySQL AB提供了多个平

mysql数据库的安装以及常见优化设置

原文:mysql数据库的安装以及常见优化设置 本文根据优才网课程整理,面向web开发者,内容以实用为主,专业DBA可以绕行. 如果你在大公司,可能有专门的DBA来做这些事情,如果你在一个小公司当架构师或者技术总监,或者你自己创业,那DBA的活你也得干了.咱们来讲一下基本的mysql安装和优化. 一: MYSQL安装和基本配置 在linux上安装,可以用包管理工具来安装,比较简单:RedHat 系列:yum -y install mysql mysql-server Debian系列:sudo a

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限.本章将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼. 9.1 高效的模型设计 最规范的就一定

Mysql数据库调优和性能优化

1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开源数据库,但是mysql数据库的默认设置性能非常的差,仅仅是一个玩具数据库.因此在产品中使用MySQL数据库必须进行必要的优化. 优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器端优化,存储引擎优化. 2. 数据库设计和查询优化 在MySQL Server性能调优中,首先要考虑的就是Database Schema设计,和

m2014-architecture-webserver-&gt;百万记录级mysql数据库及Discuz!论坛优化

作者:shunz,出处:http://shunz.net/2008/06/mysql_discuz_.html 最近,帮一个朋友优化一个拥有20万主题,100万帖子,3万多会员,平均在线人数2000人的Discuz!论坛,采用Linux2.6+Apache2+mod_php5+MySQL5,服务器配置为双至强+4G内存,优化前,系统平均负载(load average)基本维持在10以上,MySQL的CPU占用率基本在90%以上,优化后,系统平均负载降到0.5以下,MySQL的CPU占用率很少有超