数据库的约束规则与语义优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库的约束规则与语义优化 数据完整性:是指数据的精确性和可靠性。 作用: 1.防止用户向数据库中添加不合语义的数据 2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率,同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。

数据库的约束规则与语义优化

数据完整性:是指数据的精确性和可靠性。
作用:
1.防止用户向数据库中添加不合语义的数据
2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率,同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。
数据完整性分为四类:
1.实体完整性:唯一性---主键
2.域完整性:保证数据库字段取值的合理性。包括检查(CHECK),默认值(DEFAULT),不为空,可为空
3.参照完整性:主外键
4.用户自定义完整性
语义优化是从语义的角度对SQL进行优化,不是一种形式上的优化,所以其优化的范围,可能覆盖其他类型的优化范围。
语义转换:因为完整性限制等的原因使得一个转换成立的情况成为语义。
语义优化:因为语义转换形成的优化称为语义优化。
语义转换其实是根据完整性约束等信息对“某特定语义”进行推理,进而得到的一种查询效率不同但结果相同的查询。
语义优化常见的方式:
1.连接消除:例如A、B两个基表做自然连接,创建一个视图V,如果在视图V上执行查询只涉计其中一个基表的信息,则对视图的查询完全可以转化为对某个基表的查询。
2.连接引入:增加连接有助于原始关系变小或原关系的选择率降低。
3.谓词引入:根据完整性约束等信息,引入新谓词,如引入基于索引的列,可能是查询更快。
例如:一个表上,有“c1<c2”的列约束,c2列上存在一个索引,查询语句中的WHERE条件有“c1>200”,则可以推知“c2>200”,WHER条件变更为“c1>200 AND c2>200 AND c1<c2”
4.检测空回答集:查询语句中的谓词与约束相勃,可以推知条件结果为false,也许最终的结果集能为空。
例如:CHECK约束限定“score”列的范围是60到100,而一个查询条件是“score<60”,则能立刻推知条件不成立
5.排序优化:ORDERBY操作通常由索引或排序完成,如果能够利用索引,则排序操作可省略。
6.唯一性使用:利用唯一性、索引等特点,检查是否存在不必要的DISTINCT操作。

示例1:语义优化中的检测空回答集技术,MYSQL支持:


create table student(name VARCHAR(30) not null,age int);
insert into student values('tom',19);
insert into student values('marray',19);
insert into student values('jack',19);
mysql> explain EXTENDED SELECT * FROM student WHERE name IS NULL AND age>18;
+----+-------------+-------+------+------+---------+------+------+----------+------------------+
| id | select_type | table | type | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+------+---------+------+------+----------+------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE |
+----+-------------+-------+------+------+---------+------+------+----------+-----------

示例2:语义优化中的谓词引入技术,MYSQL不支持
创建表如下,列c2有唯一索引存在,并创建CHECK约束:
CREATE TABLE C (c1 INT, c2 INT UNIQUE, CHECK(c1<c2));

在c1列上进行条件查询,查询执行计划:


mysql> EXPLAIN EXTENDED SELECT * FROM C WHERE c1>60;
+----+-------------+-------+------+------+---------+------+------+-------------+
| id | select_type | table | type | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+------+---------+------+------+-------------+
| 1 | SIMPLE | C | ALL | NULL | NULL | NULL | 1 | Using where |
+----+-------------+-------+------+------+---------+------+------+-------------+

示例3:语义优化中的排序优化,mysql支持,但条件较为苛刻。
创建表如下:
CREATE TABLE D (d1 INT, d2 INT UNIQUE);
对D进行自连接,连接条件使用有唯一索引的列,且连接条件的列与排序列相同。

查询执行计划:


mysql> EXPLAIN EXTENDED SELECT * FROM D F1, D F2 WHERE F1.d2=F2.d2 ORDER BY F1.d2;
+----+-------------+-------+------+------+-----------+-----------------------------+
| id | select_type | table | type | key | ref | Extra |
+----+-------------+-------+------+------+-----------+-----------------------------+
| 1 | SIMPLE | F1 | ALL | NULL | NULL | Using where; Using filesort |
| 1 | SIMPLE | F2 | ref | d2 | tt2.F1.d2 | NULL |
+----+-------------+-------+------+------+-----------+-----------------------------+

示例4:语义优化中的唯一性使用,MySQL支持


create table e(e1 int,e2 int UNIQUE,e3 int,PRIMARY key(e1))
insert into e values(1,1,1);
insert into e values(2,null,null);
insert into e values(3,3,3);
insert into e values(4,null,null);
insert into e values(5,5,5);
mysql> EXPLAIN EXTENDED SELECT DISTINCT e1 FROM E;
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | E | index | e2 | 5 | NULL | 5 | 100.00 | Using index |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
mysql> EXPLAIN EXTENDED SELECT DISTINCT e2 FROM E;
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | E | index | e2 | 5 | NULL | 5 | 100.00 | Using index |
+----+-------------+-------+-------+------+---------+------+------+----------+-------------+
mysql> EXPLAIN EXTENDED SELECT DISTINCT e3 FROM E;
+----+-------------+-------+------+------+-----------------+
| id | select_type | table | type | key | Extra |
+----+-------------+-------+------+------+-----------------+
| 1 | SIMPLE | E | ALL | NULL | Using temporary |
+----+-------------+-------+------+------+-----------------+

示例5:语义优化中的连接消除技术MySQL不支持


create table a(a1 int,a2 int);
create table b(b1 int,b2 int);
create view v as select * from a,b;
insert into a values(1,1);
insert into a values(2,2);
insert into a values(3,3);
mysql> EXPLAIN SELECT a1, a2 FROM V WHERE a1>2;
+----+-------------+-------+------+----------------------------------------------------+
| id | select_type | table | type | Extra |
+----+-------------+-------+------+----------------------------------------------------+
| 1 | SIMPLE | b | ALL | NULL |
| 1 | SIMPLE | a | ALL | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+----------------------------------------------------+

 

原文地址 https://blog.csdn.net/qq_36594703/article/details/81269676
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 缓存 监控
数据库优化技术:提升性能与效率的关键策略
【10月更文挑战第15天】数据库优化技术:提升性能与效率的关键策略
58 8
|
14天前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
15天前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
31 4
|
17天前
|
SQL druid 数据库
如何进行数据库连接池的参数优化?
数据库连接池参数优化包括:1) 确定合适的初始连接数,考虑数据库规模和应用需求;2) 调整最大连接数,依据并发量和资源状况;3) 设置最小空闲连接数,平衡资源利用和响应速度;4) 优化连接超时时间,确保系统响应和资源利用合理;5) 配置连接有效性检测,定期检查连接状态;6) 调整空闲连接回收时间,适应访问模式并配合数据库超时设置。
|
25天前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
33 7
|
21天前
|
SQL 缓存 监控
数据库优化
【10月更文挑战第29天】数据库优化
29 1
|
25天前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
21 5
|
22天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
45 1
|
24天前
|
XML Java 数据库连接
如何使用HikariCP连接池来优化数据库连接管理
在Java应用中,高效管理数据库连接是提升性能的关键。本文介绍了如何使用HikariCP连接池来优化数据库连接管理。通过引入依赖、配置参数和获取连接,你可以显著提高系统的响应速度和吞吐量。 示例代码展示了从配置到使用的完整流程,帮助你轻松上手。
85 3
|
23天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
119 1
下一篇
无影云桌面